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 ...
Ä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.
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%Dies liegt daran, dass Ihre HashMap ein
zurückgibt %Vor%Objekt, aber die Verify-Funktion erwartet ein
%Vor%Objekt.
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?)
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ückAufruf von
%Vor%muss fehlschlagen, da Date keine Ganzzahl ist. Also, meiner Meinung nach (und nach Meinung meines Compilers) Kompilation von
%Vor%muss fehlschlagen.
Die Klasse Class
ist selbst eine generische Klasse. Wenn Sie es versuchen
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.