2008-12-16 6 views
9

Dans un groupe o » endroits dans mon code, j'ai quelque chose comme ceci:Est-ce une bonne pratique de remplacer la classe par la classe <? extends Object> pour éviter les avertissements?

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

qui provoque l'avertissement

classe est un type brut. Les références à la classe de type générique doivent être paramétrées .

Mais, si je remplace

Class

avec

Class<? extends Object>

l'avertissement va.

Cette pratique simple est-elle correcte ou pourrait-elle causer des problèmes plus tard?

Répondre

15

C'est la bonne chose à faire seulement s'il n'y a vraiment pas de classe de base ou d'interface commune que l'objet Class doit représenter.

En outre Class<?> est effectivement le même que Class<? extends Object>.

6

Selon ce que vous voulez atteindre, vous pouvez être encore plus précis:

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

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.

Questions connexes