java.util.Collections
Ich habe gerade die Implementierung der Java 7- Klasse durchlaufen und etwas gesehen, das ich nicht verstehe. max
Warum ist in der Funktionssignatur T
begrenzt durch Object
?
public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) {
Iterator<? extends T> i = coll.iterator();
T candidate = i.next();
while (i.hasNext()) {
T next = i.next();
if (next.compareTo(candidate) > 0)
candidate = next;
}
return candidate;
}
max
scheint gut zu funktionieren, wenn das gebundene Objekt weggelassen wird.
public static <T extends Comparable<? super T>> T max(Collection<? extends T> coll) {
Iterator<? extends T> i = coll.iterator();
T candidate = i.next();
while (i.hasNext()) {
T next = i.next();
if (next.compareTo(candidate) > 0)
candidate = next;
}
return candidate;
}
Gibt es tatsächlich Situationen, in denen die Grenze einen Unterschied macht? Wenn ja, geben Sie bitte ein konkretes Beispiel an.
Antworten:
Die beiden haben die gleichen Grenzen, aber es gibt einen subtilen Unterschied.
<T extends Object & Comparable<? super T>>
Dies führt
T
zu einerObject
Unterlöschung.<T extends Comparable<? super T>>
Dies führt
T
zu einerComparable
Löschung.In diesem Fall geschieht dies, weil es
.max
älter als Java 5 ist. Wir können in diesem Link sehen, dass Joachim freundlicherweise vorausgesetzt hat, dass die Signatur von.max
in Java 1.4.2 lautet:public static Object max(Collection coll)
Hätten wir
<T extends Comparable<? super T>>
als Bindung verwendet, wäre unsere Unterschriftpublic static Comparable max(Collection coll)
Welches würde die APIs brechen. Ich habe es geschafft, diese Seite zu finden , auf der die Konvertierung alter APIs in generische erläutert wird, und die
.max
ein konkretes Beispiel enthält.Hier erklären sie, warum
max
dies so definiert ist:quelle
Collection.max
vor Java 5 und als solche vor Generics. Und da der Rückgabewert istT
, würde dies die Signatur der Methode nach dem Löschen ändern.