2014-09-11 10 views
17

Ich benutze eine vergleichbare Schnittstelle die ganze Zeit, um natürliche Reihenfolge für meine Klasse durch collection.sort zur Verfügung zu stellen.Erklärung der generischen <T extends Vergleichbare <? super T>> in collection.sort/vergleichbaren code?

Grundsätzlich, wenn ich eine Personenklasse habe, werde ich es erhalten, um vergleichbare Schnittstelle zu implementieren und wird die Implementierung von compareTo bereitstellen. Doch in der Definition von Collections.sort in javadocs, ich sehe diese Signatur

public static <T extends Comparable<? super T>> void sort(List<T> list) 

ich nicht diese Generika Definition verstehen überhaupt? Sollte es nicht einfach

sein
<T implements Comparable<T>> 

Kann mir jemand dabei helfen?

+7

Es bedeutet, dass entweder die Klasse 'T' selbst oder einer ihrer Superklassen implementiert' Comparable'. –

+0

@ PM77-1 Vielen Dank für diese vereinfachte Erklärung und es scheint, dass '>' ist am richtigsten – Mushy

Antwort

23

Eigentlich bedeutet dies, dass T kann implementieren Comparable<? super T>, nicht nur Comparable<T>.

Zum Beispiel bedeutet dies, dass eine Student Klasse Comparable<Person> implementieren kann, wo Student ist eine Unterklasse von Person:

public class Person {} 

public class Student extends Person implements Comparable<Person> { 
    @Override public int compareTo(Person that) { 
     // ... 
    } 
} 

In diesem Fall kann eine Liste von Collections.sort() sortiert werden, sondern nur anhand von Person ‚s Eigenschaften, weil Sie die Student Instanz in compareTo() als Person übergeben (es sei denn Sie, natürlich, es niederwerfen). In der Praxis werden Sie nie eine Student Klasse Comparable<Person> implementieren. Das liegt daran, Person wird wahrscheinlich Comparable<Person> implementiert haben, und Student erbt es Implementierung. Das Endergebnis ist jedoch dasselbe: Sie können eine List<Student> an Collections.sort() übergeben und sie nach Person Eigenschaften sortieren lassen.

Der Unterschied zwischen Comparable<T> und Comparable<? super T> ist offensichtlich in the overloaded version of Collections.sort() dass ein Comparator<? super T> nimmt:

class ByAgeAscending implements Comparator<Person> { 
    @Override public int compare(Person a, Person b) { 
     return a.getAge() < b.getAge(); 
    } 
} 

List<Student> students = getSomeStudents(); 
Collections.sort(students, new ByAgeAscending()); 
5

Sie verwenden immer erweitert mit Generics Wildcards, auch wenn der Typ Parameter implementiert eine Schnittstelle.

Wenn Sie eine Klasse betrachten, die Comparable implementiert, werden Sie sehen, dass es tatsächlich Comparable<T> implementieren soll (sollte), wobei T die Klasse selbst ist.

Es macht Sinn, wenn Sie an den Typ-Parameter denken, der an die Comparable Schnittstelle übergeben wird und wie es in der compareTo() Methode verwendet wird.

Wie PM 77-1 eloquent darauf hingewiesen hat, die Super Schlüsselwort ermöglicht entweder die Klasse, T oder einer seiner Eltern Comparable zu implementieren.

Verwandte Themen