2010-11-19 8 views
4

J'essaie d'implémenter des génériques en Java en utilisant l'interface Comparable<T>.Utilisation de génériques dans

public static <T> T[] sort(T[] a) { 
    //need to compare 2 elements of a 
} 

Disons que je veux remplacer la méthode compareTo pour le type ci-dessus T dans l'interface Comparable. C'est à dire. J'ai besoin de comparer deux éléments de mon type T, comment vais-je le faire? Je ne sais pas quel sera mon type T.

+5

Votre titre est plutôt ... générique. Veuillez le rendre plus spécifique à votre question. –

Répondre

9

Vous devez définir une contrainte de type sur votre méthode.

public static <T extends Comparable<? super T>> T[] sort (T[] a) 
{ 
     //need to compare 2 elements of a 
} 

Cette force du type T d'avoir la méthode compareTo(T other). Cela signifie que vous pouvez faire ce qui suit dans votre méthode:

if (a[i].compareTo(a[j]) > 0) } 

} 
+0

@user, pour être honnête, je ne me souviens pas pourquoi vous avez besoin du supplément '? super T'. La méthode fonctionnera dans la plupart des cas si vous utilisez simplement 'Comparable '. ' – jjnguy

+0

' 'correspond à un type inconnu qui est un super-type de' T', ou peut-être 'T' lui-même. De même, '' est un sous-type inconnu de T, ou encore peut-être T lui-même. – eaj

+0

Le '? super T' vous permet d'avoir: 'class Person implements Comparable ; classe Student étend Personne, 'et do' sort (nouvel étudiant [] {}); ' – meriton

0

Essayez d'utiliser <T extends Comparable<T>> puis compareTo

0

question ancienne, mais ...

Comme jjnguy a répondu, vous devez utiliser:

public static <T extends Comparable<? super T>> T[] sort(T[] a) { 
    ... 
} 

Considérez ce qui suit:

public class A implements Comparable<A> {} 
public class B extends A {} 

La classe B implémente implicitement Comparable<A>, et non Comparable<B>, par conséquent votre méthode de tri n'a pas pu être utilisée sur un tableau de B si utilisé Comparable<T> au lieu de Comparable<? super T>. Pour être plus explicite:

public static <T extends Comparable<T>> T[] brokenSort(T[] a) { 
    ... 
} 

fonctionnerait très bien dans le cas suivant:

A[] data = new A[3]; 
... 
data = brokenSort(A); 

car dans ce cas, le paramètre de type T serait lié à A. Ce qui suit produirait une erreur de compilation:

B[] data = new B[3]; 
... 
data = brokenSort(B); 

parce T ne peut pas être lié à B depuis B ne met pas en œuvre Comparable<B>.

Questions connexes