2009-09-07 10 views
4

Je ne comprends pas pourquoi le code suivant génère un avertissement.Java: la conversion générique génère un avertissement, pourquoi?

interface Generic<T> { 
} 

interface A { 
} 

class B { 
    Generic<A> c; 

    <T extends A> B(Generic<T> a) { 
     c = (Generic<A>) a; //warning here 
    } 

} 

//Unchecked cast from Generic<T> to Generic<A> 

Dans la classe B je suis seulement intéressé à utiliser les instances de génériques qui sont de type A. Cet avertissement suggère que je dois stocker l'argument générique comme T au lieu de A.

Mais cette signifie que je devrais aussi déclarer B générique, ce qui semble rendre les choses plus compliquées qu'elles ne devraient l'être.

+0

Que se passe-t-il lorsque vous ne jouez pas? – aperkins

+0

erreur d'incompatibilité de type – Mike

Répondre

6

Ce n'est pas vers le bas-casting, puisque Java génériques sont invariantes: Generic<T> n'est pas un sous-type de Generic<A> même si T est un sous-type de A. Si vous avez seulement besoin de méthodes génériques qui renvoient un, vous pouvez utiliser wildcard Generic<? extends A> en B constructeur et dans le champ qui stocke la référence.

5

Parce qu'un Generic<T> n'est pas un sous-type de Generic<A> même si T est un sous-type de A.

Pour illustrer cela, considérons String exemple de Object:

List<String> listOfStrings = new ArrayList<String>(); 
List<Object> listOfObjects = (List<Object>)listOfStrings; // invalid 
listOfObjects.add(new Date()); 
// now listOfStrings contain a date! 

Le compilateur ne permet pas que la distribution, car il peut provoquer la corruption de la liste initiale. La JVM n'applique pas les exigences de limites génériques lors de l'exécution.

La solution consiste à déclarer le champ c comme 'Generic`.

+1

exemple classique des dangers des génériques en java –

Questions connexes