web-dev-qa-db-fra.com

dans Java, classe <? étend quelque chose>

Class<? extends Something>

Voici mon interprétation, c'est le modèle de classe mais la classe? signifie que le nom de la classe est indéterminé et étend la classe Something.

s'il y a quelque chose qui ne va pas dans mon interprétation, faites-le moi savoir.

50
lilzz

Tu as presque raison. Fondamentalement, Java n'a pas de concept de modèles (C++ a). C'est ce qu'on appelle des génériques. Et cela définit une classe générique Class<> avec l'attribut générique étant n'importe quelle sous-classe de Something.

Je suggère de lire " Quelles sont les différences entre les types" génériques "en C++ et Java? " si vous voulez obtenir la différence entre les modèles et les génériques.

32
Krizz

Il y a quelques réponses déroutantes ici, donc je vais essayer de clarifier les choses. Vous définissez un générique comme tel:

public class Foo<T> {
    private T t;
    public void setValue(T t) {
        this.t = t;
    }
    public T getValue() {
        return t;
    }
}

Si vous voulez qu'un générique sur Foo étende toujours une barre de classe, vous devez le déclarer comme tel:

public class Foo<T extends Bar> {
    private T t;
    public void setValue(T t) {
        this.t = t;
    }
    public T getValue() {
        return t;
    }
}

Le ? est utilisé lorsque vous déclarez une variable.

Foo<? extends Bar>foo = getFoo();

OR

DoSomething(List<? extends Bar> listOfBarObjects) {
    //internals
}
41
Daniel Moses

Tu as raison

La définition est que la classe doit être un sous-type de quelque chose

C'est la même chose que Class<T>, mais il y a une condition que T doit extends Something Ou implements Something comme l'a suggéré Anthony Accioly

Il peut également s'agir de la classe Something elle-même

10
Jan Vorcak

Vous avez raison.

Dans Java génériques, le ? opérateur signifie "n'importe quelle classe". Le mot clé extends peut être utilisé pour qualifier cela à "toute classe qui étend/implémente Something (ou isSomething).

Ainsi vous avez "le Class d'une classe, mais cette classe doit être ou étendre/implémenter Something".

4
Mac

Vous avez raison.

Cependant, vous voudrez généralement nommer la classe qui étend quelque chose et écrire par exemple <E extends Something>. Si tu utilises ? vous ne pourrez rien faire avec le type donné plus tard.

3
Thomas Ahle