Kann jemand erklären, warum es auf der Zuweisungszeile eine Warnung wegen nicht typisierter Konvertierung gibt? Beachten Sie, dass keine Warnung bei X- oder Z-Zuweisungen vorhanden ist.
%Vor% b
hat den Typ Entity
, was ein Rohtyp ist. Daher sieht seine API wie folgt aus:
Sie konvertieren also von Entity
nach Entity<Integer>
. Der Compiler hat jede Korrelation zwischen dem Parameter type
und der Art der zurückgegebenen Entität verloren, so dass keine Überprüfung mehr möglich ist.
Um es anders auszudrücken, könnten Sie verwenden:
%Vor% ... und immer noch nur die gleiche Warnung erhalten. Wenn Sie dieselbe Änderung mit x
oder z
versuchen, erhalten Sie stattdessen einen Kompilierungsfehler.
BEARBEITEN: Wie in Kommentaren erwähnt, entfernt die Tatsache, dass Sie einen unformatierten Typ verwenden, alle Spuren von Generika.
Von JLS Abschnitt 4.8 :
Um die Verbindung mit nicht-generischem Legacy-Code zu erleichtern, ist es möglich, das Löschen (§4.6) eines parametrisierten Typs (§4.5) oder das Löschen eines Array-Typs (§10.1), dessen Elementtyp ist, als Typ zu verwenden ein parametrisierter Typ Ein solcher Typ wird als Rohtyp bezeichnet.
Und dann in Abschnitt 4.6 :
Beim Typ löschen wird auch die Signatur (§ 8.4.2) eines Konstruktors oder einer Methode auf eine Signatur abgebildet, die keine parametrisierten Typen oder Typvariablen hat. Das Löschen einer Konstruktor- oder Methodensignatur s ist eine Signatur, die aus dem gleichen Namen wie s und den Löschungen aller in s angegebenen formalen Parametertypen besteht.
Aus der Deklaration:
%Vor% a
wird eingegeben, daher ist der Methodenaufruf a.typed( Integer.class )
ebenfalls typisiert.
In typed( b, Integer.class )
funktioniert das, weil die Methode generisch ist.
Aber in
%Vor% Sie haben Generika deaktiviert (für b
, indem Sie den Raw-Typ anstelle der generischen Version von Entity
verwenden), so dass der Aufruf b.typed( Integer.class )
nicht typisiert ist. So erhalten Sie die Warnung.