2010-11-20 5 views
2

Je suis en train de créer une liste de la liste des chaînes,erreur d'incompatibilité de type

List<List<String>> string= new ArrayList<ArrayList<String>>(); 

et obtenir type erreur Mismatch: ne peut pas convertir ArrayList<ArrayList<String>>-List<List<String>>.

Je sais que je peux changer

List<List<String>> to ArrayList<ArrayList<String>> 

et cela fonctionnera très bien.

Mais je me demandais juste pourquoi cela ne le laissait-il pas se produire? Simple List<Object> peut se référer à ArrayList<Object> alors qu'est-ce qui est différent à ce sujet?

Répondre

1

Parce qu'un List<List<String>> accepterait d'autres listes de chaînes qui n'étaient pas des listes de tableaux, ce qui n'est pas la manière dont vous avez déclaré le type initialement. Par exemple, si vous êtes converti en un List<List<String>>, vous pouvez techniquement lui ajouter un LinkedList<String>! Et ce n'est pas un ArrayList<String>. Permettre cette distribution casserait effectivement le système de type générique. En d'autres termes, vous pourrait convertir en List<ArrayList<String>>. Mais pas List<List<String>>.

+0

Merci, bonne explication. Aussi, merci StudiousJoseph. –

1
List<List<String>> string = new ArrayList<List<String>>() 

serait la bonne façon de le faire.

Cordialement,

1

Vous ne pouvez pas affecter ArrayList<ArrayList<String>>-List<List<String>> parce qu'elle viole la promesse type de sécurité lors de la compilation des génériques. Si cette affectation était valide, nous pouvons insérer LinkedList<String> dans ArrayList<ArrayList<String>> et inverser la sécurité de type. L'exemple canonique de ceci est List<Number> n'est pas List<Integer>. Il peut être montré facilement par contradiction.

List<Integer> ints = new ArrayList<Integer>(); 
ints.add(42); 

//This results in compiler error 
/* List<Number> nums = ints; */ 
//If it were not and an error, then you could 

List<Number> nums = ints; 
//Now you can insert doubles into a list of `Number`s 
nums.add(0.1); 

//This would allow 0.1 to assign to an int 
Integer x=ints.get(1); 
//This will cause ClassCastException and 
//violate type-safety provided by generics. 
0

En plus de ce que les gars ont déjà dit que je voudrais remarquer que la définition que vous avez écrit: ArrayList>() travaille pour vous, mais n'est pas assez bon.

Vous devriez dire:

Liste> Liste = new ArrayList>();

La règle n'écrit jamais de classe concrète dans la définition des génériques et dans la partie gauche de l'affectation s'il existe une classe ou une interface abstraite. Ma version permet à l'avenir de modifier l'implémentation de la liste sans aucun changement de code utilisant cette structure de données.

En outre la liste est une collection. Si cela ne vous importe pas d'utiliser des fonctionnalités de liste spécifiques (par ex.si vous allez seulement itérer sur cette liste) vous pouvez dire ce qui suit:

Collection> list = new ArrayList>();

Dans ce cas, à l'avenir, vous pouvez changer même liste pour définir:

Collection> Liste = new LinkedHashSet>();