web-dev-qa-db-fra.com

Java - La signification de <T étend Comparable <T>>?

Le contexte complet étant:

public class RClass<T extends Comparable<T>>

Aurais-je raison de dire que la déclaration dans le titre signifie que les arguments connectés à la méthode doivent être soit un objet d'une classe qui implémente Comparable OR l'une de ses classes dérivées?

Merci.

31
LTH

Cela signifie que le paramètre type doit prendre en charge la comparaison avec d'autres instances de son propre type, via l'interface Comparable.

Un exemple d'une telle classe est fourni dans le tutoriel Oracle Object Ordering . Notez le modèle similaire à T extends Comparable<T> dans l'extrait ci-dessous:

public class Name implements Comparable<Name> {
   ...
   public int compareTo(Name n) { ... }
}
33
Andy Thomas

Java- La signification de<T extends Comparable<T>>?

une) Comparable <T> est une interface générique (rappelez-vous que c'est une "interface" c'est-à-dire pas une "classe")

b) extends signifie l'héritage d'une classe ou d'une interface.

Du point ci-dessus # a, c'est une interface .. (Rappelez-vous que c'est un héritage d'une "interface" c'est-à-dire pas d'une "classe")

c) De ce qui précède les deux points #a & #b,

ici "une interface" étend "une autre interface".

Il devrait y avoir une interface définie pour cette classe .. juste un exemple ici est

interface MinMax<T extends Comparable<T>> { 
    T min(); 
    T max(); 
} 

d) maintenant votre classe, c'est-à-dire public class RClass {} DEVRAIT

1 # SOIT "implémenter" cette "interface générique" Comparable<T> .. !!!

ex: public class RClass<T> implements Comparable<T>

2 # OR créer une interface et étendre à cette "interface générique" Comparable<T> ex:

interface MinMax<T extends Comparable<T>> { 
   T min(); 
   T max(); 
} 
class RClass<T extends Comparable<T>> implements MinMax<T> {
    .....
    .....
}

Ici, faites particulièrement attention à la façon dont le paramètre de type T est déclaré par RClass, puis passé à MinMax. Étant donné que MinMax nécessite un type qui implémente Comparable, la classe d'implémentation (RClass dans ce cas) doit spécifier la même limite. De plus, une fois cette limite établie, il n'est pas nécessaire de la spécifier à nouveau dans la clause implements.

9
guhan vj

Quelque part dans cette classe, le programmeur doit écrire quelque chose comme

if(t.compareTo(othert) < 0) {
    ...
}

Pour que cela fonctionne, le type T doit avoir une méthode compareTo qui le compare à un autre objet de type T. L'extension Comparable garantit entre autres l'existence d'une telle méthode.

5
jforberg

Oui, et gardez à l'esprit que les objets des classes dérivées de Comparable SONT DES OBJETS Comparable. L'héritage est un is-a relation.

2
Luchian Grigore

Cela signifie que vous ne pouvez créer qu'une instance de RClass avec un type qui étend littéralement Comparable<T>. Ainsi,

RClass<Integer> a;

est acceptable, car Integer étend Comparable<Integer>, tandis que

RClass<Object> b;

ne l'est pas, puisque Object n'est pas une classe qui s'étend du tout comparable.

2
djhaskin987

==> guhanvj, <T extends Comparable<T>> signifie que <T> a la limite supérieure de Comparable<T> objets. Alors <T> peut avoir des types de classes Byte, Character, Double, Float, Long, Short, String et Integer qui implémentent tous Comparable<T> interface pour l'ordre naturel.

Autrement dit, le type générique T doit être comparable pour pouvoir comparer to. sinon vous ne pouvez pas faire T.compareTo. Dans le point 28 Java efficace, il suggère: "always use Comparable<? super T> in preference to Comparable<T>. <T extends Comparable<? super T>>"

1
Andrew Xie