Unerwartete ungeprüfte Konvertierungswarnung

8

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%     
Konstantin Komissarchik 01.05.2013, 16:47
quelle

3 Antworten

6

b hat den Typ Entity , was ein Rohtyp ist. Daher sieht seine API wie folgt aus:

%Vor%

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.

    
Jon Skeet 01.05.2013, 16:53
quelle
1

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.

    
Bhesh Gurung 01.05.2013 16:53
quelle
0

Sie "downcasting" a und entfernen den Typbezeichner beim Zuweisen von b. Da b jetzt nicht typisiert ist, erhalten Sie eine Warnung wegen nicht typisierter Konvertierung, da der Typ nicht mehr bekannt ist.

    
cmbaxter 01.05.2013 16:53
quelle

Tags und Links