[JAVA] Verlieren Sie nicht gegen die ungeprüfte Warnung! → Immerhin konnte ich die ungeprüfte Warnung nicht gewinnen ...

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

Verlieren Sie nicht gegen die ungeprüfte Warnung! → Immerhin konnte ich die ungeprüfte Warnung nicht gewinnen ...
Immerhin wollte ich den Inhalt von MySQL mit Docker in der Vorschau anzeigen ...
Ich möchte nach dem Dezimalpunkt abschneiden
[Rails] Ich weiß nicht, wie ich das Modell verwenden soll ...
Ich kann das Docker-Image nach dem Update auf Docker Desktop 2.4.0.0 nicht finden
Was ist mit den typischen Änderungen in Apache Wicket 8 passiert?
Ich habe versucht, die Methode zu erklären
Ich war süchtig nach Scrollview, weil ich nicht auf die UIView mit variabler Größe tippen konnte