Wenn ich versuche, Java zu übertragen und Folgendes zu schreiben, wird eine ungeprüfte Warnung angezeigt.
Object obj = new SomeClass();
SomeClass some = (SomeClass)obj;
Um dies zu vermeiden, verwenden Sie die "cast" -Methode in der "Class" -Klasse.
Object obj = new SomeClass();
SomeClass some = SomeClass.class.cast(obj);
Es scheint, dass es so gemacht werden sollte.
Was passiert dann im nächsten Fall?
Object obj1 = new Hoge<Fuga>();
Hoge<Fuga> some1 = (Hoge<Fuga>)obj1;
Object obj2 = new Hoge<Piyo>(); //Piyo ist eine Unterklasse von Fuga
Hoge<? extends Fuga> some2 = (Hoge<? extends Fuga>)obj2;
Object obj3 = new Hoge<Moge>(); //Moge ist Fugas Superklasse
Hoge<? super Fuga> some3 = (Hoge<? super Fuga>)obj3;
Zusammenfassend scheint es, dass die ungeprüfte Warnung für Casts mit Generika nicht vermieden werden kann. Im Fall von Java wird der vom Generikum angegebene Typ zur Kompilierungszeit gelöscht, so dass es anscheinend nicht möglich ist, ihn richtig zu beurteilen und umzuwandeln. Selbst mit Stackoverflow "Was soll ich tun?" "Ich kann nicht. Aufgeben und" @ SuppressWarnings "verwenden" Wird ausgetauscht.
Abgesehen davon ist die Implementierung der oben erwähnten "cast" -Methode der "Class" -Klasse so.
@SuppressWarnings("unchecked")
public T cast(Object obj) {
if (obj != null && !isInstance(obj))
throw new ClassCastException(cannotCastMsg(obj));
return (T) obj;
}
Immerhin verwenden Sie @SuppressWarnings (" nicht markiert ")
(Wut)
Es scheint also, dass Sie "@SuppressWarnings (" unchecked ")" leise hinzufügen oder eine eigene Cast-Methode erstellen müssen, um Warnungen wie die "Cast" -Methode der "Class" -Klasse zu vermeiden.
Recommended Posts