2010-01-17 6 views
34

Tout d'abord, je ne connais que les bases de Java. Maintenant, j'ai le scénario suivant:Comment définir des contraintes sur les types génériques en Java?

J'ai une classe générique:

public class ListObject<T> 
{ 
    // fields 
    protected T _Value = null; 
     // .. 
} 

Maintenant, je veux faire quelque chose comme ce qui suit:

ListObject<MyClass> foo = new ListObject<MyClass>(); 
ListObject<MyClass> foo2 = new ListObject<MyClass>(); 
foo.compareTo(foo2); 

Le problème est, comment puis-je définir la .compareTo() Méthode lorsque T est générique? Je suppose que je dois implémenter une contrainte sur le T générique pour dire que T implémente une interface spécifique (peut-être Comparable, si celle-là existe).

Quelqu'un peut-il me fournir un petit échantillon de code?

Répondre

41

Lire aussi la discussion ici: Generics and sorting in Java

réponse courte, le meilleur que vous pouvez obtenir est:

class ListObject<T extends Comparable<? super T>> { 
    ... 
} 

Mais il y a aussi des raisons de simplement utiliser:

class ListObject<T extends Comparable> { 
    ... 
} 
+1

Je vais m'en tenir à ListObject pour le moment. – citronas

+3

Vérifiez également le fil connexe: http://stackoverflow.com/questions/2064169/what-does-this-class-declaration-mean-in-java/2072820, qui traite de la nécessité d'un caractère générique de forme: sateesh

2

Essayez public class ListObject<T extends U>. Seuls les T qui implémentent U (ou dérivent de U) seront des substitutions autorisées.

+0

me donne une erreur de compilation. Même avec un si simple TestClass: public class ConstraintTest {} Erreur de syntaxe sur jeton "outils" ,, Qu'est-ce que escomptée de ce que je manque? – citronas

+0

@citronas: C'est en fait 'extends' même pour les interfaces. Notez que si vous utilisez une classe de base avec l'attribut 'extends', vous pouvez ajouter la classe de base directement à l'objet généré, c'est l'effet secondaire * (et pire) * le plus important de l'extension générique. – Esko

+0

Oups. Mon mauvais, merci pour la capture, @Esko. –

-2
public class ListObject<T implements Comparable> {...} 
+4

-1 Eliminé car Comparable sans le paramètre type est un type brut que vous ne devriez pas utiliser avec Java 1.5+ – helpermethod

+2

cette syntaxe n'est pas valide – newacct

4

Cela dépend exactement de ce que vous voulez que la méthode compareTo fasse. définir simplement la méthode compareTo de prendre d'autres valeurs ListObject<T> est fait par ce qui suit

public class ListObject<T> { 
    public int compareTo(ListObject<T> other) { 
    ... 
    } 
} 

Toutefois, si vous voulez réellement appeler des méthodes sur ce paramètre, vous aurez besoin d'ajouter des contraintes pour donner plus d'informations sur la valeur T comme si

class ListObject<T extends Comparable<T>> { 
    ... 
} 
Questions connexes