Génériques et le point d'interrogation
Je voudrais utiliser une liste générique, mais la méthode d'initialisation ne renvoie une List
.
Le code suivant fonctionne bien:
List tmpColumnList = aMethodToInitializeTheColumnList();
tmpColumnList.add("ANICELITTLECOLUMN");
Java accuse que je suis en utilisant une crue de type et je dois paramerize la liste.
J'ai donc ajouté le point d'interrogation paramétrer cette liste.
List<?> tmpColumnList = aMethodToInitializeTheColumnList();
tmpColumnList.add("ANICELITTLECOLUMN");
Problème, c'est: Maintenant, le add(..)
méthode ne fonctionne plus.
Je ne peut pas assurer que la liste ne contient que String
s comme aMethodToInitializeTheColumnList()
n'est pas mis en œuvre dans mon code.
Quelle est mon erreur?
Merci!
source d'informationauteur guerda
Vous devez vous connecter pour publier un commentaire.
De médicaments Génériques, Tutoriel. Grâce à Michael réponse!
Vous voudrez probablement utiliser
List<String>
- c'est la façon dont les Génériques sont destinés à être utilisés, c'est à dire ajouter des informations sur ce genre d'objets dans une collection. Si vous êtes allez avoir une Liste contenant les types mixtes (ce qui est généralement le signe d'une mauvaise conception) utilisationList<Object>
Pour plus d'informations sur l'utilisation de caractères génériques, regardez la Les Génériques Tutoriel. Mais ils sont vraiment applicable uniquement lors de la définition de vos propres classes génériques, ou des méthodes avec des paramètres génériques.
Si vous utilisez
<?>
vous voulez dire que vous n'allez pas utiliser le paramétrées type de n'importe où. Soit aller pour le type spécifique (dans votre cas, il sembleList<String>
) ou de la très génériqueList<Object>
Une autre option dans ce cas serait de déclarer votre liste
depuis ce modèles exactement ce que vous savez à ce sujet. Vous dites que vous ne savez pas exactement quel est son type de limites, mais à partir de votre deuxième ligne, il est juste de supposer qu'il doit être en mesure de contenir des chaînes de caractères.
Cette compile et à mon avis, est un peu plus agréable que de
List<Object>
il code de l'incertitude quant à ce qui peut en fait aller dans la liste. Fondamentalement, vous ne pouvez ajouter Chaînes, mais lorsque vous appelezget()
l'élément retourné pourrait être n'importe quoi (et Java de déduire correctement ce type à êtreObject
).Dans la pratique, la seule différence entre le présent et
List<Object>
est que cette dernière permettraittmpColumnList.add(3)
outmpColumnList.add(new Thread())
etc. Je préfère de beaucoup la sémantique, elle porte ainsi que la pratique.La
List<?>
signifie que la liste est (ou pourrait être) tapé, mais le type est inconnu**. Ainsi, l'ajout de quelque chose qui pourrait être mal**, si vous arrive d'être à l'extérieur de la type. Parce qu'il est inconnu, vous êtes prévenu.Vous pouvez utiliser
List<Object>
ce qui signifie une liste qui peut contenir n'importe quel type de.