2012-04-27 2 views
0

Voyons quelques déclarations de méthodes de Set<E>.Vérification de type générique à la compilation

public boolean add(E e); 
public E get(int index); 

Et essayons de l'utiliser.

List<Boolean> list = new ArrayList<Boolean>(); 
Integer i = list.get(0);    //Predictably, here we get a compile error. 
list.contains(new Integer(3));  //But this line is allowed. Why? 

Même en équivalent non générique de ce code (comme je sais, ça va tout simplement transformé en elle), nous obtenons des erreurs de compilation dans les deux lignes.

List s = new ArrayList(); 
s.contains((Boolean)(new Integer(3))); 
Integer i = (Boolean)s.get(3); 

Alors pourquoi ne pas avoir l'erreur dans le cas générique?

Répondre

3

Voir la réponse à this question.

essentiellement le , remove(), etc méthodes ne se soucient que que les objets étant comparés et enlevés sont égaux , pas qu'ils ont le même type.

1

Eh bien, cette ligne:

s.contains((Boolean)(new Integer(3))); 

a erreur de compilation de temps tout simplement parce que vous ne pouvez pas jeter ce qui est clairement une instance entière à Boolean. Cela n'a rien à voir avec les génériques de List.

Ensuite, le contains(Object o) n'est pas génériquement typé (à l'intérieur de java.util.Collection), c'est pourquoi vous n'obtenez pas d'avertissement de temps de compilation. Cela a à voir avec la covariance et la contre-variance.

1

De Liste API d'interface:

E get(int index) 

Il retourne l'objet de type générique. Alors que contains obtient Object comme param:

boolean contains(Object o) 

il est tout au sujet des signatures de méthodes. En voir plus sur List

Questions connexes