Das Problem mit
List<String> list = new LinkedList();
ist, dass Sie auf der linken Seite den generischen Typ verwenden, List<String>
während Sie auf der rechten Seite den Rohtyp verwendenLinkedList
. Raw-Typen in Java existieren effektiv nur aus Gründen der Kompatibilität mit vorgenerischem Code und sollten niemals in neuem Code verwendet werden, es sei denn, Sie müssen dies unbedingt tun.
Wenn Java von Anfang an Generika hatte und keine Typen hatte, wie sie LinkedList
ursprünglich erstellt wurden, bevor es Generika hatte, hätte es wahrscheinlich so gemacht werden können, dass der Konstruktor für einen generischen Typ seine Typparameter automatisch von links ableitet -hand Seite der Aufgabe, wenn möglich. Dies ist jedoch nicht der Fall, und aus Gründen der Abwärtskompatibilität müssen Rohtypen und generische Typen unterschiedlich behandelt werden. Das lässt sie etwas anders machen müssen , aber ebenso bequeme Methode zum Deklarieren einer neuen Instanz eines generischen Objekts festlegen, ohne die Typparameter wiederholen zu müssen ... den Diamantoperator.
In Ihrem ursprünglichen Beispiel List<String> list = new LinkedList()
generiert der Compiler eine Warnung für diese Zuweisung, da dies erforderlich ist. Bedenken Sie:
List<String> strings = ... // some list that contains some strings
// Totally legal since you used the raw type and lost all type checking!
List<Integer> integers = new LinkedList(strings);
Es gibt Generika, die während der Kompilierung Schutz vor Falschem bieten. Im obigen Beispiel bedeutet die Verwendung des Rohtyps, dass Sie diesen Schutz nicht erhalten und zur Laufzeit einen Fehler erhalten. Aus diesem Grund sollten Sie keine Rohtypen verwenden.
// Not legal since the right side is actually generic!
List<Integer> integers = new LinkedList<>(strings);
Der Diamantoperator ermöglicht jedoch, dass die rechte Seite der Zuweisung als echte generische Instanz mit denselben Typparametern wie die linke Seite definiert wird ... ohne dass diese Parameter erneut eingegeben werden müssen. Es ermöglicht Ihnen, die Sicherheit von Generika mit fast zu halten dem gleichen Aufwand wie bei der Verwendung .
Ich denke, der Schlüssel zum Verständnis ist, dass Rohtypen (ohne <>
) nicht wie generische Typen behandelt werden können. Wenn Sie einen Rohtyp deklarieren, erhalten Sie keinen der Vorteile und die Typprüfung von Generika. Sie müssen auch bedenken, dass Generika ein allgemeiner Bestandteil der Java-Sprache sind ... sie gelten nicht nur für die No-Arg-Konstruktoren von Collection
s!