// 0
public static <T extends Comparable<? super T>> void sort0(List<T> list)
// 1
public static <T extends Comparable<T>> void sort1(List<? extends T> list)
Diese Signaturen unterscheiden, weil sie über die Beziehung zwischen Typ unterschiedliche Anforderungen stellen T
und die Art Argument Comparable
in der Definition von T
.
zum Beispiel Angenommen, Sie diese Klasse haben:
class A implements Comparable<Object> { ... }
Dann, wenn Sie
List<A> list = ... ;
sort0(list); // works
sort1(list); // fails
Der Grund sort1
versagt haben, ist, dass es kein Typ ist T
, die sowohl vergleichbar selbst und das ist oder ist ein Supertyp des Listentyps.
Es stellt sich heraus, dass die Klasse A
fehlerhaft ist, weil Objekte, die Comparable
sind, bestimmte Anforderungen erfüllen müssen. Insbesondere die Umkehrung des Vergleichs sollte das Vorzeichen des Ergebnisses umkehren. Wir können eine Instanz von A
mit einer Object
vergleichen, aber nicht umgekehrt, so dass diese Anforderung verletzt wird. Beachten Sie jedoch, dass dies eine Anforderung der Semantik von Comparable
ist und nicht vom Typsystem auferlegt wird. Betrachtet man nur das Typsystem, sind die beiden sort
Deklarationen wirklich unterschiedlich.
Aber wie funktioniert statisch> T max (Sammlung extends T> c) funktioniert gut ... ist das wieder ein Inferenzproblem? –
prvn
@prvn, hier haben Sie 'Comparable super T>' anstelle von 'Comparable' wie in Ihrer vorgeschlagenen Unterschrift. '> void sort (Liste extends T> Liste)' würde auch funktionieren, aber hinzufügen '? extents T 'ist hier völlig unnötig, während es in der' max'-Methode sinnvoll ist (da 'max' den Wert zurückgibt). –
Es gibt einen anderen Punkt. Wenn Sie einen Wildcard-Typ wie 'List extends T> list' haben, können Sie' list.set (index, list.get (anotherIndex)) 'nicht innerhalb der Methode ausführen, da Wildcard-Typen funktionieren. Dies kann mit einer internen Hilfsmethode umgangen werden, die '? erweitert T 'in eine andere Typvariable (oder durch Verwendung ungeprüfter Operationen, wie es interne Implementierungen oft tun), aber ein Typ ohne Platzhalter ist für eine Liste, die geändert werden soll, sauberer. – Holger