7
votes

AVERTISSEMENT DE COULEMENT UNCOMPÉE VERSONNE QU'ELLEMENT 'CLASS.FORNAME'

Mon code est comme suit

Type safety: Unchecked cast from Class<capture#1-of ?> to 
     Class<Foo>


0 commentaires

4 Réponses :


7
votes

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: xxx pré>

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 classe code> Il est légèrement plus surprenant car, en réalité, l'objet fait em> connaît la classe impliquée, mais envisage une situation similaire: p> xxx Pré>

Cette distribution ne va pas vérifier que c'est vraiment em> a list code>, car ces informations sont perdues en raison de type effacer em>. p>

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>

Class<Foo> fooClass = Foo.class;


8 commentaires

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 )' est superflu, car les «types» sont supprimés par le compilateur après compilation - le compilateur ne peut pas savoir si la classe chargée sera un «test»?


@JoeBlackDev: C'est parce que l'heure d'exécution n'a pas cette information de type générique en général. Si vous appelez getclass () sur un arraylist Il s'agira de la même valeur que si vous l'appelez sur un 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 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


Il peut y avoir plusieurs implémentations de FOO, et on voudrait sélectionner lequel au moment de l'exécution.



1
votes

Si vous connaissez la classe exacte, vous n'avez pas besoin d'utiliser la classe.fororname xxx

Il est logique que de le faire lorsque vous ne connaissez pas le type.


0 commentaires

3
votes

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 de classe , non si elle est de type classe . C'est à quoi ressortit l'avertissement.

Une méthode a été spécifiquement ajoutée à la classe 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 )


0 commentaires

42
votes

Premièrement, si vous connaissez la classe exacte, vous n'avez pas besoin class.forname . foo.class va faire. (Avant J2SE 5.0, foo.class effectivement compilé pour faire class.forname ("foo") puis la mettant en cache dans une statique.)

Qu'est-ce que vous avez probablement vouloir est quelque chose comme: xxx

(quand je dis veux, les moulages et particulièrement la réflexion sont mal.)

Comme cela se produit, il y a un approprié Méthode pour faire la distribution "en toute sécurité" (en supposant que foo 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. xxx


1 commentaires

Cool! Merci. C'est ce que je veux.