Qu'est-ce que List<?>
signifie, cela signifie-t-il simplement une liste d'objets de type non spécifié?
Recherche de la chaîne <?>
ne renvoie rien d'utile (:
Le mot-clé dont vous avez besoin pour obtenir plus d'informations est caractères génériques
Comme l'a dit Tom, le ?
, ou caractère générique illimité, signifie que le type de l'objet n'est pas spécifié. Il peut être inconnu, peut être destiné à plusieurs valeurs possibles ou peut être tout simplement hors de propos. Votre exemple, List<?>
, se prononce "Liste des inconnus". C'est pratique parce qu'il est flexible, mais il y a aussi des pièges car vous ne pouvez pas enfoncer des objets aléatoires et les retirer de groupes d'inconnus en toute impunité.
Ressources:
Soit dit en passant, votre recherche Google a échoué, car Google ne propose pas de caractères spéciaux:
À quelques exceptions près, la ponctuation est ignorée (c'est-à-dire que vous ne pouvez pas rechercher @ # $% ^ & * () = + []\et d'autres caractères spéciaux).
(EDIT: J'ai dû être vraiment fatigué quand j'ai écrit cela hier soir. Mise en forme nettoyée/ajout d'une petite info.)
Pour répondre à cette question, je dois expliquer les caractères génériques non limités et les caractères génériques délimités.
Le contenu de ce message a été assemblé à partir de la documentation Java.
Le type de caractère générique illimité est spécifié à l'aide du caractère générique (
?
), Par exemple,List<?>
. C'est ce qu'on appelle une liste de type inconnu. Il existe deux scénarios où un caractère générique illimité est une approche utile:
Si vous écrivez une méthode qui peut être implémentée à l'aide des fonctionnalités fournies dans la classe Object.
Lorsque le code utilise des méthodes dans la classe générique qui ne dépendent pas du paramètre type. Par exemple,
List.size
OuList.clear
. En fait,Class<?>
Est si souvent utilisé car la plupart des méthodes deClass<T>
Ne dépendent pas deT
.
Considérez une application de dessin simple qui peut dessiner des formes telles que des rectangles et des cercles. Pour représenter ces formes dans le programme, vous pouvez définir une hiérarchie de classes comme celle-ci:
public abstract class Shape {
public abstract void draw(Canvas c);
}
public class Circle extends Shape {
private int x, y, radius;
public void draw(Canvas c) {
...
}
}
public class Rectangle extends Shape {
private int x, y, width, height;
public void draw(Canvas c) {
...
}
}
Ces classes peuvent être dessinées sur une toile:
public class Canvas {
public void draw(Shape s) {
s.draw(this);
}
}
Tout dessin contient généralement un certain nombre de formes. En supposant qu'ils sont représentés sous forme de liste, il serait pratique d'avoir une méthode dans Canvas qui les dessine tous:
public void drawAll(List<Shape> shapes) {
for (Shape s: shapes) {
s.draw(this);
}
}
Maintenant, les règles de type disent que
drawAll()
ne peut être appelé que sur des listes de Shape exactement: il ne peut pas, par exemple, être appelé sur unList<Circle>
. C'est malheureux, car tout ce que la méthode fait est de lire les formes de la liste, donc elle pourrait tout aussi bien être appelée sur unList<Circle>
. Ce que nous voulons vraiment, c'est que la méthode accepte une liste de tout type de forme: public void drawAll (Liste des formes) {...} Il y a une petite mais très importante différence ici: nous avons remplacé le typeList<Shape>
avecList<? extends Shape>
. Maintenant,drawAll()
acceptera les listes de n'importe quelle sous-classe deShape
, nous pouvons donc l'appeler sur unList<Circle>
Si nous le voulons.
List<? extends Shape>
Est un exemple de caractère générique délimité. Le?
Représente un type inconnu, cependant, dans ce cas, nous savons que ce type inconnu est en fait un sous-type de Shape. (Remarque: il peut s'agir de Shape lui-même ou d'une sous-classe; il n'est pas nécessaire d'étendre littéralement Shape.) Nous disons que Shape est la borne supérieure du caractère générique .
De même, la syntaxe ? super T
, Qui est un caractère générique borné, désigne un type inconnu qui est un sur-type de T. Un ArrayedHeap280<? super Integer>
, Par exemple, inclut ArrayedHeap280<Integer>
, ArrayedHeap280<Number>
Et ArrayedHeap280<Object>
. Comme vous pouvez le voir dans la documentation Java pour la classe Integer , Integer est une sous-classe de Number qui à son tour est une sous-classe d'Object.
Il semble que vous devriez rechercher de la documentation sur les génériques Java.
Le List<?>
signifie qu'il s'agit d'un objet basé sur un type actuellement non spécifié. Cette spécification est faite lorsque la classe est instanciée.
Par exemple:
List<String> listOfStrings = new ArrayList<String>();
est une liste d'objets String.
List
est une interface que vous pouvez implémenter vous-même et également implémentée par certaines des collections Java, comme Vector
.
Vous pouvez fournir des informations de saisie au moment de la compilation à l'aide des crochets angulaires. Le type le plus générique serait Object
, ce qui serait List<Object>
. Le <?>
vous voyez indique une liste de certaines sous-classes de Object
ou Object
. C'est comme dire List<? extends Object>
, ou List<? extends Foo>
, où List
contient des objets d'une sous-classe de Foo
ou des objets de Foo
lui-même.
Vous ne pouvez pas instancier un List
; c'est une interface, pas une implémentation.
List<?>
Signifie List<? extends Object>
Donc dans Collection<E>
Vous trouverez containsAll(Collection<?> c)
qui vous permet d'écrire
List<Object> objs = Arrays.<Object>asList("one",2,3.14,4);
List<Integer> ints = Arrays.asList(2,4);
assert objs.containsAll(ints);//true
Lorsque vous retirez un élément d'une collection, vous devez le convertir en type d'élément stocké dans la collection. En plus d'être gênant, cela n'est pas sûr. Le compilateur ne vérifie pas que votre distribution est identique au type de la collection, de sorte que la distribution peut échouer au moment de l'exécution.
Les génériques vous permettent de communiquer le type d'une collection au compilateur, afin qu'il puisse être vérifié. Une fois que le compilateur connaît le type d'élément de la collection, le compilateur peut vérifier que vous avez utilisé la collection de manière cohérente et peut insérer les conversions correctes sur les valeurs retirées de la collection.
? n'est rien d'autre que Wildcard dans les génériques
Il existe 3 types différents de caractères génériques dans les génériques
1) Caractères génériques délimités supérieurs: utilise l'extension du mot clé
eg: List<? extends SuperClass>
2) Caractères génériques inférieurs
eg:Uses Super key Word List<? super SubClass>
3) Caractère générique illimité
List<?> list