2009-06-27 4 views
1

J'ai un morceau de code que je pense devoir compiler, mais ce n'est pas le cas. Voici le code:Passer une liste concrète d'objets EnumMap à la liste générique du paramètre EnumMap provoque l'erreur de compilation

public class Program { 
public void myMethod(List<EnumMap<? extends MyInterface, String>> map) 
{ 

} 

public void caller() 
{ 
    EnumMap<MyEnum, String> map = new EnumMap<MyEnum, String>(MyEnum.class); 

    List<EnumMap<MyEnum, String>> list = new LinkedList<EnumMap<MyEnum, String>>(); 

    myMethod(list); //error argument type is not compatible 

} 

}

MyEnum est un ENUM qui implémente MyInterface. Pourquoi l'appel de myMethod (list) me donne le type d'argument n'est pas compatible?

Si je change la signature de myMethod à:

public void myMethod(List<? extends Map<? extends MyInterface, String>> map) 

alors tout fonctionne très bien, mais je suis toujours perplexe et je souhaite savoir pourquoi la signature de méthode originale ne fonctionne pas.

Répondre

1

EnumMap<MyEnum, String> et EnumMap<? extends MyInterface, String> sont des types différents (le premier est un sous-type de ce dernier). Donc List<EnumMap<MyEnum, String>> et List<EnumMap<? extends MyInterface, String>> ne sont pas compatibles les uns avec les autres. En général, List<A> ne peut pas être affecté à List<B> si A et B sont des types différents, quelle que soit la relation entre A et B (même chose s'applique à tout type générique et pas seulement à List). Lorsque vous avez un paramètre de type borné, c'est une histoire différente; la compatibilité prend en compte les limites.

2

Ainsi, étant donné

enum MyEnum implements MyInterface { ...} 
... 
List<EnumMap<MyEnum, String>> as = new ArrayList<EnumMap<MyEnum, String>>(); 
List<EnumMap<? extends MyInterface, String>> bs; 

Nous devrions être en mesure d'attribuer bs = as?

Supposons maintenant

enum OtherEnum implements MyInterface { XXX } 
... 
EnumMap<OtherEnum, String> otherMap = 
    new EnumMap<OtherEnum, String>(OtehrEnum.class); 
otherMap.put(OtherEnum.XXX, ""); 
bs.set(0, otherMap); 
EnumMap<MyEnum, String> myMap = as.get(0); 
MyEnum xxx = myMap.keys().iterator().next(); 

otherMap et le point myMap au même objet, mais bien différents types. Pire, xxx est de tyoe MyEnum mais pointe vers un objet de type OtherEnum.

Les pointeurs vers les pointeurs en présence de polymorphisme sont difficiles.

+0

Merci, je comprends ce que vous dites, mais comment faire pour changer la signature de la méthode au public void myMethod (List > map) fait disparaître l'erreur? L'erreur ne devrait-elle pas rester? – Alvin

Questions connexes