41 votes

Est la liste <?> le parent commun de la liste <Integer> et liste <Number> ?

À partir de cet Oracle tutoriel,

Bien qu' Integer est un sous-type d' Number, List<Integer> n'est pas un sous-type de l' List<Number> et, en fait, ces deux types ne sont pas liés.

La mère commune de List<Number> et List<Integer> est List<?>.

Ma question est au sujet de la deuxième phrase. Comment peut-on dire qu' List<?> est la mère commune de List<Number> et List<Integer>?

? représente un type inconnu, qui pourrait être tout type de référence. Même si je dis qu' ? serait Object ici, Object étant la mère commune de Integer et Number ne signifie PAS qu' List<Object> devient un parent commun d' List<Integer> et List<Number>.

29voto

Basit Anwer Points 677

Le contexte vous devez comprendre, c'est pas de l' Integer ou Number mais c'est l' List. Supposons que vous étiez celui de la création de l' List classe puis comment voulez-vous créer la classe de sorte qu'il ne supporte qu'un type spécifique de la classe.

Oui, c' List classe de ne pas utiliser un Objet comme type, mais plutôt utiliser une wild-card, ?.

Comme la documentation des caractères dire

Quel est donc le supertype de toutes sortes de collections? Elle est écrite en Collection<?> (prononcé "collection de l'inconnu")

La même chose peut être dit pour la Liste.

Quel est donc le supertype de toutes sortes de Listes? Elle est écrite en List<?> "(prononcé Liste de inconnu")

12voto

dejvuth Points 2111

Nous pouvons prouver que List<?> est un supertype de List<Number> et List<Integer>.

De JLS 4.10.2 (l'emphase est mienne):

Étant donné un générique de déclaration de type C<F1,...,Fn> (n > 0), l' direct aux supertypes de la paramétrée type C<T1,...,Tn>, où Ti (1 ≤ i ≤ n) est un type, sont tous des éléments suivants:

  • ...

  • C<S1,...,Sn>Si contient Ti (1 ≤ i ≤ n) (§4.5.1)

en remplaçant C avec List et n=1, nous savons qu' List<?> est directement supertype de List<Number> et List<Integer> si ? contient Number et Integer.

Nous pouvons prouver que ? contient Number et Integer en raison de JLS 4.5.1:

Le "joker" ? extends Object est l'équivalent de la surabondance de la wildcard ?.

et plus loin:

Un argument de type T1 est dit contenir un autre argument de type T2, écrites T2 <= T1, si l'ensemble des types indiqués par T2 est prouvable un sous-ensemble de l'ensemble des types indiqués par T1 en vertu de la réflexivité et de la fermeture transitive des règles suivantes (où <: désigne le sous-typage (§4.10)):

  • ? extends T <= ? extends S si T <: S
  • ...
  • T <= ? extends T

nous pouvons utiliser les règles ci-dessus pour prouver qu' Number <= ?car Number <= ? extends Number <= ? extends Object = ?.

5voto

Kevin Wallis Points 3038

Le tutoriel est sur les caractères génériques. Donc, ils veulent expliquer quand et comment vous devez les utiliser. Quand vous lisez à l'avance il y a l'exemple de code:

List<? extends Integer> intList = new ArrayList<>();
List<? extends Number>  numList = intList;  // OK. List<? extends Integer> is a subtype of List<? extends Number>

Vous ne pouvez faire cette mission s' ? est la mère commune de Integer et Number. Je pense que dans la relation avec les caractères génériques et les médicaments génériques, il est possible de dire que:

List<?> est la mère commune de List<Number> et List<Integer>

car il faut voir le contexte de ce tutoriel.

3voto

Voici les types de méthodes génériques utilisés par les méthodes en Java:

 interface Collection<E> {
...
public boolean contains(Object o);
public boolean containsAll(Collection<?> c);
...
}
 

La première méthode n'utilise pas du tout de génériques! La deuxième méthode est notre première vue d’une abréviation importante. Le type Collection signifie:

Collection<? extends Object>

L'extension d'objet est l'une des utilisations les plus courantes des caractères génériques. Il est donc logique de fournir une forme abrégée pour l'écrire.

3voto

makadev Points 811

On mélange les concepts de la programmation orientée objet à l'héritage ou types de béton avec l'un des types génériques et les relations entre ces génériques.

Une phrase dans le tutoriel sur les caractères génériques et les sous-types qui dit tout:

Afin de créer une relation entre ces classes ... utiliser une des limites supérieures générique

Pour le générique de relations de type ? est tout simplement le plus haut délimitée à partir de la possible jokers ? extends <type> (limites supérieures générique), ? super <type> (inférieure délimitée générique) et le type (la correspondance exacte ou "supérieure et inférieure délimitée générique").

Les caractères génériques sont utilisés pour obtenir les deux concepts de génériques et de la programmation orientée objet à travailler d'une manière ordonnée les uns avec les autres, mais ce n'est pas la même. Il suffit de mettre: List<?> est la mère commune de List<Integer> et List<Number> parce que le caractère générique de la relation est spécifié en tant que tel que toute autre joker crée un sous-type de relation avec ?. C'est plus ou moins le secteur informel de l'explication, regardez dejvuth de réponse pour les pièces de béton de la spécification.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X