web-dev-qa-db-fra.com

Que signifie List <?> Dans les génériques Java génériques?

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 (:

42
corydoras

Le mot-clé dont vous avez besoin pour obtenir plus d'informations est caractères génériques

32
Chris Pitman

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:

  • Les caractères génériques sont discutés ici dans le tutoriel Java.
  • Il y a un bon - si verbeux - tutoriel sur les génériques en général par Angelika Langer disponible ici .
  • Et il y a un autre bon aperçu ici (PDF) par Gilad Bracha; consultez les pages 5-7.
  • Enfin, si vous pouvez mettre la main sur Java efficace par Josh Bloch, il contient une excellente section sur les génériques et les cas dans lesquels vous pouvez, pouvez ' t, devrait et ne devrait pas utiliser de caractères génériques (chapitre 5, pages 109-146 dans la deuxième édition).

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).

- page d'aide Google

(EDIT: J'ai dû être vraiment fatigué quand j'ai écrit cela hier soir. Mise en forme nettoyée/ajout d'une petite info.)

43
Pops

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.

1. Caractères génériques illimités

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 Ou List.clear. En fait, Class<?> Est si souvent utilisé car la plupart des méthodes de Class<T> Ne dépendent pas de T.

2. Caractères génériques délimités

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 un List<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 un List<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 type List<Shape> avec List<? extends Shape>. Maintenant, drawAll() acceptera les listes de n'importe quelle sous-classe de Shape, nous pouvons donc l'appeler sur un List<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.

6
Farhad Maleki

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.

4
Tom Duckering

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.

3
Jonathon Faust

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
2
non sequitor

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.

chk dis pdf

0
Summy

? 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
0
Naresh Devarasetty