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.
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.
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
}
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
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
".
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.