Mon code est comme suit
Type safety: Unchecked cast from Class<capture#1-of ?> to Class<Foo>
4 Réponses :
Eh bien, pour commencer avec Soyons clairs là où le problème est - c'est dans le casting lui-même. Voici un exemple plus court: Cela a toujours le même problème. La question est que la distribution ne va pas tester quoi que ce soit - car la distribution sera efficacement convertie en type code> de classe code>. Pour Cette distribution ne va pas vérifier que c'est vraiment em> a maintenant dans votre cas, il y a une solution plutôt plus simple - si vous connaissez le nom de la classe à la compilation de toute façon, utilisez simplement: P> classe
list
Class<Foo> fooClass = Foo.class;
Je pense que le vrai problème est; Pourquoi utiliser la classe.forname () si vous connaissez le type?
Est-ce parce que ceci est une opération d'exécution? Donc, la quintessence est que, à la compilation, le '(Classe
@JoeBlackDev: C'est parce que l'heure d'exécution i> n'a pas cette information de type générique en général. Si vous appelez getclass () code> sur un
arraylist
ArrayList
@Peter Lawrey - Je pense que je vois ce que tu veux dire. Pourquoi ne pas simplement créer une instance de 'foo' à la place ...
@Peter: eh bien c'est partie i> du problème (comme je le mentionne dans mon post), mais cela pourrait bien venir d'un exemple plus compliqué qui a plus de sens. Il vaut la peine de comprendre les principes de l'avertissement, de l'OMI.
@Jon Skeet C'est ce que je pensais. Le compilateur supprimera toutes les informations de «type» à la fin. Ok, je vais éviter d'utiliser la classe.forname. Je ne pense pas que cela ait vraiment un sens dans ce cas.
@Jon, aucun exemple ci-dessus n'est parfait. Pour une raison quelconque à moi, j'oublie que vous pouvez appeler myClass.class code>
Il peut y avoir plusieurs implémentations de FOO, et on voudrait sélectionner lequel au moment de l'exécution.
Si vous connaissez la classe exacte, vous n'avez pas besoin d'utiliser la classe.fororname Il est logique que de le faire lorsque vous ne connaissez pas le type. P > p>
Le système d'exécution n'a aucune connaissance des génériques et il ne peut donc pas vérifier que quelque chose est de type Une méthode a été spécifiquement ajoutée à la classe code> code> pour éviter cet avertissement. Vous pouvez l'utiliser au lieu de vous jeter vous-même: http://download.oracle.com/javase/6/docs/api/java/lang/class.html#Assubclass (java.lang.class ) p> de classe code>, non si elle est de type
classe
Premièrement, si vous connaissez la classe exacte, vous n'avez pas besoin Qu'est-ce que vous avez probablement vouloir est quelque chose comme: p> (quand je dis veux, les moulages et particulièrement la réflexion sont mal.) p> Comme cela se produit, il y a un approprié Méthode pour faire la distribution "en toute sécurité" (en supposant que class.forname code>.
foo.class code> va faire. (Avant J2SE 5.0,
foo.class code> effectivement compilé pour faire
class.forname ("foo") code> puis la mettant en cache dans une statique.)
foo code> n'est pas en soi générique). En toute sécurité, ne fournissant pas de référence à un objet incompatible, non pas comme dans son insecte ni aucune exception inattendue. P>
Cool! Merci. C'est ce que je veux.