2010-11-19 16 views
4

Ich versuche Generics in Java mit Comparable<T> Schnittstelle zu implementieren.Mit Generics in Comparable

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

Lassen Sie uns sagen, ich habe die compareTo Methode für die oben genannten Typs T in der Comparable Schnittstelle außer Kraft setzen möchten. I.e. Ich muss zwei Elemente meines Typs vergleichen T, wie werde ich es tun? Ich weiß nicht, was mein T Typ sein wird. Versuchen

+5

Ihr Titel ist eher ... generisch. Bitte präzisieren Sie Ihre Frage. –

Antwort

9

Sie benötigen eine Typeinschränkung auf Ihrer Methode zu setzen.

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

Dies zwingt den Typ T die compareTo(T other) Methode zu haben. Dies bedeutet, dass Sie die folgenden in Ihrer Methode tun können:

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

} 
+0

@user, um ehrlich zu sein, ich erinnere mich nicht, warum Sie das Extra brauchen? Super T'. Die Methode funktioniert in den meisten Fällen, wenn Sie nur 'Comparable ' verwenden. – jjnguy

+0

'' steht für einen unbekannten Typ, der ein Super-Typ von 'T' ist, oder möglicherweise' T' selbst. Ebenso ist "" ein unbekannter Untertyp von T oder wiederum möglicherweise T selbst. – eaj

+0

Die '? Super T' ermöglicht Ihnen: 'class Person implementiert Comparable ; Klasse Student erweitert Person; 'and do' sort (new Student [] {}); ' – meriton

0

<T extends Comparable<T>> und anschließend compareTo

0

alte Frage, aber ...

Als jjnguy reagiert, müssen Sie verwenden:

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

Betrachten Sie das folgende:

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

Die Klasse B implementiert implizit Comparable<A>, nicht Comparable<B>, daher könnte Ihre Sortiermethode nicht für ein Array von B verwendet werden, wenn Comparable<T> anstelle von Comparable<? super T> verwendet wird. Um noch deutlicher:

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

würde im folgenden Fall gut funktionieren:

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

, weil in diesem Fall des Typ-Parameter T würde A gebunden sein. In der folgenden würde einen Compiler-Fehler erzeugen:

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

weil T nicht B da B gebunden werden kann, nicht Comparable<B> implementieren.