Bonjour,
Dans les Generics : Pourquoi
class Essai <T extends Number> {} est OK
et
class Essai <T super Integer> {} est NOT OK
Bonjour,
Dans les Generics : Pourquoi
class Essai <T extends Number> {} est OK
et
class Essai <T super Integer> {} est NOT OK
Parce que ce ne sont pas des jokers comme <? extends Number> ou <? super Number> qui servent à donner de l'information sur le joker.
Ici c'est juste une définition de type paramètre, noté T, sur lequel on sait tout puisque c'est nous qui le déclarons, et nous y ajoutons une contrainte "T doit être un sous-type de Number." Ce n'est pas une information c'est une obligation.
La contrainte "T doit être un sous-type de Number" est utile, ça permet d'appliquer le polymorphisme : le type T peut appeler les méthodes de Number et on peut toujours assigner un T à un Number.
Une contrainte du genre "T doit être un sur-type de Number" ne sert à rien -_-°.
Pas forcément, il y a aussi Comparator<? super E> cmp; qui indique un type "Comparator de on ne sait pas quoi, mais dont on sait que c'est un type ascendant de E. On peut donc lui demander de comparer des E".
Dans ce contexte ce n'est pas exact (et ça a donné lieu à des engueu*** lors des spécifications).
Ici le mot "extends" a un autre sens comme plutot "affectable à ...." exemple <T extends Serializable> (Serializable n'est pas une classe)
autre exemple (facheux) :
<T extends Object & Comparable<? super T>> (dans java.util.Collections)
Partager