92 votes

Java Generics WildCard : < ? extends Number> vs <T extends Number>

Quelle est la différence entre ces deux fonctions ?

static void gPrint(List<? extends Number> l) {
    for (Number n : l) {
        System.out.println(n);
    }
}

static <T extends Number> void gPrintA(List<T> l) {
    for (Number n : l) {
        System.out.println(n);
    }
}

Je vois le même résultat.

57voto

Thilo Points 108673

Il n'y a pas de différence dans ce cas, car T n'est plus jamais utilisé.

La raison de la déclaration d'un T est de pouvoir s'y référer à nouveau, liant ainsi deux types de paramètres ou un type de retour ensemble.

49voto

Bohemian Points 134107

La différence est que vous ne pouvez pas faire référence à T lors de l'utilisation d'un joker.

Vous ne l'êtes pas en ce moment, il n'y a donc "pas de différence", mais voici comment vous pourriez utiliser T pour faire la différence :

static <T extends Number> T getElement(List<T> l) {
    for (T t : l) {
        if (some condition)
            return t;
    }
    return null;
}

Le résultat est le suivant le même type comme tout ce qui est passé. Par exemple, ces deux éléments seront compilés :

Integer x = getElement(integerList);
Float y = getElement(floatList);

15voto

ns89 Points 8

T est un type limité, c'est-à-dire que quel que soit le type que vous utilisez, vous devez vous en tenir à ce type particulier qui étend Number par exemple, si vous passez un Double à une liste, vous ne pouvez pas lui passer un type Short comme T est du type Double et la liste est déjà délimitée par ce type. En revanche, si vous utilisez ? ( wildcard ), vous pouvez utiliser "n'importe quel" type qui étend la notion de Number (ajouter les deux Short y Double à cette liste).

-2voto

Kanagaraj M Points 756

Lorsque vous utilisez T, vous pouvez effectuer toutes sortes d'actions sur la liste. Mais lorsque vous utilisez T, vous ne pouvez pas effectuer d'ajout.

T - identique à la référence d'objet avec accès complet
? - donner un accès partiel

static void gPrint(List<? extends Number> l) {
 l.add(1); //Will give error
for (Number n : l) {
    System.out.println(n);
}

static <T extends Number> void gPrintA(List<T> l) {
l.add((T)1); //We can add
for (Number n : l) {
    System.out.println(n);
}

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