/ / Warum sind Generika in Java-Kollektionen so seltsam? - Java, Generics, Compiler-Konstruktion

Warum sind Generika in Java-Sammlungen so seltsam? - Java, Generika, Compiler-Konstruktion

Überprüfen Sie beispielsweise die Methode in java.util.Collections

 public static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c)

Warum kann ich es so definieren:

 public static <T> int binarySearch(List<T> list, T key, Comparator<T> c)

Warum funktioniert das in Java nicht?

Antworten:

14 für die Antwort № 1

Sie könnte Definieren Sie es so, aber dann würden Sie nicht a suchen List<Circle> Verwendung einer Comparator<Shape>, beispielsweise.

Grundsätzlich ermöglicht die hier ausgedrückte Varianz mehr Flexibilität bei gleichzeitiger Aufrechterhaltung der Typsicherheit.


0 für die Antwort № 2

Zu verstärken Jon Skeet"s Antwort ein bisschen, Java Generics sind nicht wie C ++Vorlagen. Einige der Designentscheidungen (wie das Löschen des Typs) für Generics, die aus Gründen der Abwärtskompatibilität der JVM selbst getroffen wurden, führen zu einer unangenehmen Syntax und zu komplizierten Anwendungsfällen. Einige davon können Sie hier lesen.