Aus technischer Sicht verfügt Java bei der Verwendung von Generika über eine Typinferenz . Mit einer generischen Methode wie
public <T> T foo(T t) {
return t;
}
Der Compiler wird das analysieren und verstehen, wenn Sie schreiben
// String
foo("bar");
// Integer
foo(new Integer(42));
Für den ersten Aufruf wird eine Zeichenfolge und für den zweiten Aufruf eine Ganzzahl zurückgegeben, basierend auf dem, was als Argument eingegeben wurde. Als Ergebnis erhalten Sie die richtige Überprüfung zur Kompilierungszeit. Darüber hinaus kann man in Java 7 zusätzliche Typinferenzen erhalten, wenn Generika wie diese instanziiert werden
Map<String, String> foo = new HashMap<>();
Java ist so nett, die leeren spitzen Klammern für uns auszufüllen. Warum unterstützt Java keine Typinferenz als Teil der Variablenzuweisung? Zu einem bestimmten Zeitpunkt gab es eine RFE für die Typinferenzierung in Variablendeklarationen, die jedoch geschlossen wurde, weil "Nicht behoben"
Der Mensch profitiert auf zweierlei Weise von der Redundanz der Typdeklaration. Erstens dient der redundante Typ als wertvolle Dokumentation - Leser müssen nicht nach der Deklaration von getMap () suchen, um herauszufinden, welchen Typ er zurückgibt. Zweitens ermöglicht die Redundanz dem Programmierer, den beabsichtigten Typ zu deklarieren und dadurch von einer vom Compiler durchgeführten Gegenprüfung zu profitieren.
Der Beitragende, der dies schloss, bemerkte auch, dass es sich einfach "un-java-like" anfühlt, dem ich zustimmen kann. Javas Ausführlichkeit kann sowohl ein Segen als auch ein Fluch sein, aber sie macht die Sprache zu dem, was sie ist.
Natürlich war diese besondere RFE nicht das Ende dieser Unterhaltung. In Java 7 wurde diese Funktion erneut in Betracht gezogen , und einige Testimplementierungen wurden erstellt, darunter eine von James Gosling. Auch dieses Feature wurde letztendlich abgeschossen.
Mit der Veröffentlichung von Java 8 erhalten wir jetzt Typinferenz als Teil von Lambdas als solche:
List<String> names = Arrays.asList("Tom", "Dick", "Harry");
Collections.sort(names, (first, second) -> first.compareTo(second));
Der Java-Compiler kann die Methode Collections#sort(List<T>, Comparator<? super T>)
und dann die Schnittstelle von Comparator#compare(T o1, T o2)
und bestimmen, first
und second
sollte String
es dem Programmierer daher ermöglichen, auf das erneute Eingeben des Typs im Lambda-Ausdruck zu verzichten.