Ist es gute Praxis zu ersetzen Klasse mit der Klasse Objekt erweitert>, um Warnungen zu vermeiden?
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?
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.