Ich bin kein Java-Experte, also bin ich mir nicht ganz sicher, was ich sagen werde. Hier sind meine Gedanken:
Da Java Generics durch Löschen implementiert, gibt es für jeden generischen Typ einen zugrunde liegenden unformatierten Typ. Wenn Sie einen generischen Typ definieren, wird ein zugrunde liegender unformatierter Typ verwendet, der rundherum Object
verwendet.
Wenn Sie einen neuen ArrayList
instanziiert, wäre es falsch, für Compiler den Typ-Parameter aus der Instanziierung Klasse (ArrayList<String>
in Ihrem Beispiel) zu schließen, da es eine Klasse mit genau diesem Namen ist und kein Typ-Parameter (dh die Rohtyp, ArrayList
). Ich denke auch, dass dies der Grund ist, warum Sie in Java 7 <>
zum Aufruf des Konstruktors hinzufügen müssen, um dem Compiler mitzuteilen, dass er den Typ ableitet.
Man könnte argumentieren, dass der Compiler den Raw-Typ nur instanziieren sollte, wenn die Definitionsklasse der Raw-Typ ist, aber ich denke, dass es verwirrend wäre. Ich denke, dass der Compiler von unvollständigen Ausdrücken ableiten muss, die ohne gegebenen Kontext ungültig wären, was für die new ArrayList()
-Anweisung nicht der Fall ist.
Ich hoffe, das ist klar, und wenn ich falsch liege, kann mich jemand korrigieren.
Randbemerkung:
Auch hüte dich, dass die rohe Klasse ist nicht der gleiche wie der Typ Object
als Typ-Parameter verwendet:
List<String> list = new ArrayList();
gültig ist, wo als
List<String> list = new ArrayList<Object>();
ist nicht. Im ersten Fall kann der Raw-Typ verwendet werden, als ob er ein generischer Typ wäre, aber im zweiten Fall fragen Sie nach Kontravarianz, die nicht verfügbar ist (nicht, wenn Sie keine Platzhalter verwenden).
Gibt es einen Zweck zu fragen "Warum kann Sprache X Y nicht enthalten?"? Die Antwort lautet normalerweise "weil es nicht dazu bestimmt war". – skaffman
Warum? Oh warum! Das ist eine meiner größten Beschwerden über die Generika-Implementierung in Java. Das Wrappen des Konstruktors in einer statischen Factory-Methode bewirkt, dass die Typinferenz wie ein Charm wirkt, also warum nicht mit dem Konstruktor! –
@skaffman: stimmt, aber das Verwirrende ist, dass Typinferenz für parametrisierte Methoden existiert, so dass die Regeln und die Komplexität der Implementierung bereits existieren. Nur nicht für Objekt-Instanziierung! –