Pas vraiment un programmeur Java, mais lire quelques bons articles sur les médicaments génériques.
Oui, vous devez ajouter un caractère générique ou le type exact (Class<MySpecialClass>
) pour ajouter de la sécurité. La raison en est que la classe est un générique. Donc, Class<Bar>
et Class<Foo>
sont les mêmes après effacement de leur paramètre de type générique. Ils deviennent tous Class
, le type dit brut. Cet effacement se produit lors de la compilation. Quelques exemples pour illustrer ce où le compilateur vous aide à la coulée automatique (gestion des exceptions omis par souci de concision):
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
}
}
}
Dire Class<?>
(et l'équivalent Class<? extends Object>
), vous dites au compilateur que vous vouliez vraiment une classe dont T
est l'objet , et n'a pas accidentellement utilisé le type brut. Mais il n'ajoutera aucun moulage de commodité. Tout ce que génériques font est d'insérer des moulages automatiques pour vous, à partir de Object
au type de destination. Les génériques sont les mêmes qu'ils soient utilisés avec le type U ou avec le type T au moment de l'exécution pour des raisons de compatibilité avec les anciennes versions de Java.