Frage

In einem Bündel o‘Orte in meinem Code, ich habe so etwas wie folgt aus:

public Class mySpecialMethod() {
  return MySpecialClass.class;
}

, die die Warnung verursacht

  

Klasse ist eine rohe Art. Referenzen zu   generischer Typ Klasse sollte   parametriert.

Aber wenn ich ersetzen

Class

mit

Class<? extends Object>

Die Warnung geht weg.

Ist diese einfache Praxis ok, oder es könnte Probleme verursachen später?

War es hilfreich?

Lösung

Es ist die richtige Sache nur zu tun, wenn es wirklich keine gemeinsame Basisklasse oder Schnittstelle, die das Klassenobjekt muss darzustellen.

Auch Class<?> ist das Gleiche wie Class<? extends Object>.

Andere Tipps

Ja, es ist völlig richtig.

Es ist erforderlich, dass Sie den Typ angeben. Und wenn Sie nicht können, haben Sie die Platzhalter angeben.

Weiterführende Literatur: Java Language Specification: parametrisierte Typen

Je nachdem, was Sie erreichen wollen, können Sie noch präziser sein:

public Class<MySpecialClass> mySpecialMethod() {
  return MySpecialClass.class;
}

Nicht wirklich ein Java-Programmierer hier, aber einige gute Papiere über Generika lesen.

Ja, sollten Sie einige Wildcard oder die genaue Art (Class<MySpecialClass>) in Sicherheit hinzuzufügen. Der Grund dafür ist, dass die Klasse ist ein generische. Also, Class<Bar> und Class<Foo> sind gleich nach dem Löschen ihrer generischen Typparameter. Sie alle werden Class, die so genannte rohe Art. Das Löschen geschieht beim Kompilieren. Einige Beispiele zu illustrieren dies, wo der Compiler Sie mit automatischen Gießen hilft (Ausnahme der Kürze halber weggelassen Abwicklung):

class Mine { }

class Vara {
    public static void main(String... args) {
        { // works. translated to Mine m = (Mine) c.newInstance();
            Class<Mine> c = Mine.class;
            Mine m = c.newInstance();
        }
        { // doesn't work. need a cast: Mine m = (Mine) c.newInstance();
            Class c = Mine.class; // also Class<?> or Class<? extends Object>
            Object o = c.newInstance(); // but this works. pointing to a Mine
            Mine m = (Mine) c.newInstance(); // needs a manual cast
        }
    }
}

Sagen Class<?> (und das Äquivalent Class<? extends Object>), sagen Sie der Compiler Sie wirklich eine Klasse, deren T ist Gegenstand wollte, und nicht genutzt versehentlich die rohe Art. Aber es wird keine Bequemlichkeit Abgüsse hinzufügen. Alles, was Generika tun, ist die automatische Abgüsse für Sie einfügen, von Object zum Zieltyp zu werfen. Generika sind die gleiche, ob mit Typ-U verwendet oder mit Typ T zur Laufzeit aus Gründen der Kompatibilität mit älteren Java-Versionen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top