Question

Dans un groupe o » endroits dans mon code, j'ai quelque chose comme ceci:

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

ce qui provoque l'avertissement

  

La classe est un type brut. Les références à   Classe de type générique devrait être   paramétrés.

Mais, si je remplace

Class

avec

Class<? extends Object>

l'avertissement disparaît.

Cette pratique est simple, ok, ou pourrait-il causer des problèmes plus tard?

Était-ce utile?

La solution

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

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

Autres conseils

Oui, il est tout à fait raison.

Il est une exigence que vous spécifiez le type. Et si vous ne pouvez pas, vous devez spécifier le caractère générique.

Pour en savoir plus: Java Language Specification: paramétrées Types

En fonction de ce que vous voulez atteindre, vous pouvez être encore plus précis:

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

Pas vraiment un programmeur Java, mais lu quelques bons articles sur les médicaments génériques.

Oui, vous devez ajouter un peu de caractère générique ou le type exact (Class<MySpecialClass>) pour ajouter de la sécurité. La raison est que la classe est un générique. Ainsi, et Class<Bar> sont les mêmes Class<Foo> après l'effacement de leur paramètre de type générique. Ils deviennent tous Class, le type cru que l'on appelle. Ce effacement se produit lors de la compilation. Quelques exemples pour illustrer ce où le compilateur vous aide à la coulée automatique (sauf manipulation omise 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 avez vraiment voulu une classe dont l'objet est T, et ne pas accidentellement utilisé le type brut. Mais il ne sera pas ajouter des moulages de commodité. Tout ce que les génériques faire est d'insérer des moulages automatiques pour vous, de jeter de le type Object de destination. Les médicaments génériques sont les mêmes qu'ils soient utilisés avec le type U ou avec le type T lors de l'exécution pour des raisons de compatibilité avec les versions java plus.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top