web-dev-qa-db-fra.com

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 ceci:

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

Question:

Comment puis-je définir la méthode compareTo() avec resprect au générique T?

Je suppose que je dois en quelque sorte implémenter une contrainte sur le générique T, pour dire que T implémente une interface spécifique (peut-être Comparable, si celle-ci existe).

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

40
citronas

Lisez aussi la discussion ici: Génériques et tri en Java

Réponse courte, le mieux que vous puissiez obtenir est:

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

Mais il y a aussi des raisons de simplement utiliser:

class ListObject<T extends Comparable> {
    ...
}
49
nanda

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

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

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

class ListObject<T extends Comparable<T>> {
  ...
}
5
JaredPar

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

2
John Feminella