Java Generics mit Klasse T

8

Ich habe also eine Karte:

%Vor%

Und ich würde Elemente wie folgt hinzufügen:

%Vor%

Ich habe eine generische Methode wie folgt:

%Vor%

Jetzt funktioniert dieser Code ohne Probleme mit dem Compiler:

%Vor%

Aber wenn ich das versuche:

%Vor%

Der Compiler zeigt mir diese Warnung: Type safety: Ungeprüfter Aufruf verifyType (String, Class) der generischen Methode verifyType (String, Class)

Das macht mich verwirrt ... bitte helfen ...

    
Jay 31.05.2009, 14:04
quelle

6 Antworten

8

Ändern:

%Vor%

bis

%Vor%

Wenn Sie den Typ nur als 'Klasse' deklarieren, verlieren Sie den generischen Parameter, und die verifyType () -Methode kann die Klasse nicht ableiten, daher die ungeprüfte Warnung.

Dieses Problem:

%Vor%

kann aufgrund von Typlöschen nicht wirklich gelöst werden. Der Compiler kann den Typ basierend auf einem generischen Parameter, der zur Laufzeit nicht mehr existiert, nicht ableiten. Dies liegt daran, dass Java-Generics kaum mehr als Rauch und Spiegel zum Casting sind.

    
cletus 31.05.2009, 14:13
quelle
4

Sie müssen Ihre Referenzen auf Class generisch machen. Zum Beispiel:

%Vor%

würde gut funktionieren.

Wie würde:

%Vor%

Dies wird jedoch nie funktionieren:

%Vor%

Weil Format nicht definiert ist als:

%Vor%

Wenn es wäre, würde das Casting funktionieren, aber das Design wäre sinnlos.

Der nächste, den Sie bekommen können, ist:

%Vor%

Sie werden jedoch eine Compiler-Warnung erhalten, die Sie verwenden müssen - es ist eine von Natur aus unsichere Besetzung. Der Compiler nimmt Ihr Wort dafür, dass die format.get-Anweisung eine Ganzzahl zurückgibt. Wenn Sie sich dessen sicher sind, dann sind das für unsichere Casts. Wenn Sie die Compiler-Warnung loswerden wollen, können Sie dies tun:

%Vor%     
Yishai 31.05.2009 14:52
quelle
2

Dies liegt daran, dass Ihre HashMap ein

zurückgibt %Vor%

Objekt, aber die Verify-Funktion erwartet ein

%Vor%

Objekt.

    
Nathaniel Flath 31.05.2009 14:11
quelle
1

Der Grund, warum Sie diesen Fehler erhalten, besteht darin, dass der Compiler im ersten Fall erkennt, dass Sie ein Klassenobjekt übergeben und T zur Kompilierungszeit an Integer binden können. Im zweiten Fall erkennt der Compiler jedoch nur, dass Sie übergeben werden es ein Klassenobjekt.

Am Ende des Tages werden Sie nicht in der Lage sein

zu tun %Vor%

in einer typsicheren Weise, da der Compiler nicht wissen kann, dass Sie eine Integer erhalten werden (was ist, wenn jemand einen format.put ("Vendor Number", X.class) gerade vor diesem Aufruf erstellt?)

    
waxwing 31.05.2009 14:16
quelle
1

Es ist seltsam für mich, dass Ihr Compiler in der Zeile

ist %Vor%

beschwert sich über den ungeprüften Aufruf, zeigt aber keinen Fehler wie "Typ stimmt nicht überein: kann nicht von Objekt zu Ganzzahl konvertieren".

Diese Zeile ergibt für mich keinen Sinn. Was erwartet verifyType, wenn es Date.class als zweiten Parameter erhält? Auch eine Ganzzahl (dann ist der Rückgabetyp von verifyType ungültig)? Oder ein Date? Wenn Sie ein Datum erwarten, wie erwartet der Compiler das

? %Vor%

gibt Integer.class zurück, aber

%Vor%

gibt Date.class

zurück

Aufruf von

%Vor%

muss fehlschlagen, da Date keine Ganzzahl ist. Also, meiner Meinung nach (und nach Meinung meines Compilers) Kompilation von

%Vor%

muss fehlschlagen.

    
Tadeusz Kopec 31.05.2009 16:03
quelle
0

Die Klasse Class ist selbst eine generische Klasse. Wenn Sie es versuchen

%Vor%

sollte es besser funktionieren. Die Generalisierung des Eingabeparameters überzeugt den Compiler, dass Sie wissen, was Sie tun, genug, um Ihren Code ohne Warnung kompilieren zu lassen.

Sie können den Compiler auch überzeugen, indem Sie die Warnung mit

unterdrücken %Vor%

vor der spezifischen Codezeile oder Methode.

    
Yuval 31.05.2009 14:15
quelle

Tags und Links