2013-02-11 2 views
0

J'ai créé une liste comme ci-dessous.Arraylist générique avec joker de l'objet

ArrayList<? extends Object> arr = new ArrayList<Object>(); 

ce que je comprends par ligne au-dessus c'est une limite supérieure tout élément qui est la sous-classe d'objet peut être ajouté à la liste. Maintenant, je suis en train comme ceci:

String str = new String("str"); 
Integer i = new Integer(4); 
Object obj = new Object(); 
arr.add(obj); 
arr.add(str); 
arr.add(i); 

tout Ils donnent error.What est le problème ici? Mais quand je change à

ArrayList<? super Object> arr = new ArrayList<Object>(); 

Tous works.It est minorant. Quelqu'un peut-il me l'expliquer?

Répondre

3

Vous ne pouvez rien ajouter dans la collection sauf la valeur lorsque votre collection utilise des caractères génériques avec des majuscules comme type générique. La raison en est que vous pourriez simplement ajouter un mauvais moment dans votre collection. Pour plus d'explications Refer This

0

Déclaration ArrayList <? extends Object> arr signifie que arr est un ArrayList avec des éléments d'un type inconnu, et la seule chose connue sur ce type inconnu est qu'il étend Object. Une fois que vous ne connaissez pas le type d'éléments ArrayList, la seule valeur que vous pouvez ajouter est null. Mettre n'importe quelle autre valeur entraînera une erreur car le compilateur ne peut pas vérifier que la valeur que vous mettez en ArrayList est convertible en le type (inconnu) des éléments ArrayList. L'événement le code suivant sera illégal:

arr.set (0, arr.get (0)); 

Il est illégal parce que du point de vue du compilateur arr.get (0) renvoie la valeur d'un certain type inconnu, qui étend l'objet, de sorte qu'il menace cela comme arr.set (0, (Object)arr.get (0)). Mais il ne peut pas mettre en toute sécurité la valeur de type Object dans arr car arr n'est pas ArrayList de Object, mais plutôt ArrayList ou un type inconnu qui s'étend Object. Il peut être ArrayList de String ou ArrayList de Integer ou autre.

+0

alors pourquoi son fonctionnement? ArrayList arr = new ArrayList (); Ici, nous avons aussi un type inconnu. –