J'ai deux questions, actaully...
Tout d'abord, Pourquoi ne peux-je faire ceci:
List<Object> object = new List<Object>();
Et la deuxième, j'ai une méthode qui retourne un List<?>
comment pourrais-je le transformer en un List<Object>
serais-je en mesure de simplement le jeter?
Merci!
source d'informationauteur Chris
Vous ne pouvez pas faire cela parce que
List
est une interface, et les interfaces ne peuvent pas être instanciées. Seulement (béton) classes peuvent être. Des exemples de classes concrètes de mise en œuvreList
inclureArrayList
LinkedList
etc.Ici est de savoir comment on va créer une instance de
ArrayList
:Nous montrer le code et je vais mettre à jour la réponse.
Vous ne pouvez pas faire cela parce que Liste est une interface et vous ne pouvez pas créer un objet de n'importe quelle interface ou en d'autres mots, vous ne peut pas instancier une interface. En outre, vous pouvez affecter n'importe quel objet de la classe qui implémente Liste à sa variable de référence. Par exemple, vous pouvez faire ceci:
Ici ArrayList est une classe qui implémente Listevous pouvez utiliser n'importe quelle classe qui implémente Liste.
Liste est une interface de sorte que vous ne pouvez pas l'instancier. Utiliser l'un de ses implementatons au lieu par exemple
Sur La Liste :
vous pouvez utiliser n'importe quel objet comme un générique param pour il exemple:
ou
Tout en utilisant
List<Object>
cette déclaration n'est pas valide, car il sera de type missmatch.Pour répondre à votre deuxième question, oui, vous pouvez lancer le
List<?>
comme unList<Object>
ou unList<T>
de tout type, depuis la?
(Générique) paramètre indique que la liste contient un groupe homogène d'un toutObject
. Cependant, il n'y a aucun moyen de savoir à compiler ce que letype
est depuis qu'il fait partie de l'API exportées seulement - ce qui signifie que vous ne pouvez pas voir ce qui est insérée dans laList<?>
.Voici comment vous pourriez faire la distribution:
Dans ce cas, vous pouvez ignorer l'avertissement parce que pour qu'un objet puisse être utilisé dans une classe générique, il doit être un sous-type de
Object
. Imaginons que nous sommes en train de jeter ce qu'unList<Integer>
quand il contient en fait une collection deString
s.Rappelez-vous: les types génériques sont effacés au moment de l'exécution. Vous ne savez pas ce que la collection contient, mais vous pouvez obtenir un élément et d'un appel
.getClass()
sur elle pour déterminer son type.