2010-07-06 5 views
-1

mon IDE génère un avertissement lorsque j'utilise le code suivant:Java génériques de type inférer

aMethod(List.class); 

« sécurité Type: L'expression de type Liste doit être convertie sans contrôle pour se conformer à ... » Malheureusement quand je tente pour laisser l'IDE le réparer, ça ne marche pas. Quelle est la syntaxe appropriée pour inférer le type générique? Merci d'avance pour toute aide.

modifier:

Signature de la méthode:

public static <T> T aMethod(Class<T> clazz) 

permet de faire simple et dire le type que je veux Référé à String est.

Kuku

+3

S'il vous plaît nous montrer la déclaration de 'aMethod'. –

+0

peut-être dupliquer de http://stackoverflow.com/questions/367626/how-do-i-fix-the-expression-of-type-list-needs-unchecked-conversion –

+1

Cela rendrait le travail de détective beaucoup plus facile si vous le vouliez ne pas couper ce dont il a besoin pour se conformer à ... Ou fournir une signature de 'aMethod' –

Répondre

3

Si vous voulez seulement supprimer le Waring du code:

aMethod(Class<?> clazz); 

Pour les classes qui héritent de la classe Collection Vous pouvez utiliser quelque chose ceci:

public <T extends Collection<?>> void clazz(Class<T> clazz); 
1

List.class est ce qui est connu comme un type brut.

Les génériques utilisent l'effacement de type pour supprimer les types paramétrés du code compilé. Les vérifications de typesafe sont effectuées uniquement au moment de la compilation. C'est le compilateur qui s'assure que vous n'ajoutez que des chaînes à une liste.

Lors de l'exécution, la chaîne a disparu et votre List<String> fonctionne exactement comme une liste de pré-génériques. Donc, vous le passez à une méthode qui essaie de deviner ce que le T est dans List<T>. Mais il ne sera jamais capable de le déterminer, puisque l'information aura disparu.

Comme les types ne peuvent pas être mis en correspondance, le compilateur vous avertit que votre code peut autoriser un accès non sécurisé à votre liste. En effet, étant donné que List<String> et List<Integer> sont traités de la même manière au moment de l'exécution et sont tous les deux représentés par List.class, vous risquez de vous placer dans une situation où, lors de l'exécution, votre code pourrait tenter d'ajouter un String à un List<Integer> qui échouerait.

Voir aussi

Generics in the JLS

+0

Vous pouvez également jeter un oeil au chapitre des génériques dans Effective Java SE, qui couvre * exactement * ce problème. – atamanroman

+0

La méthode générique provient d'une bibliothèque que j'utilise. Donc, je comprends bien que ma seule option ici est de supprimer l'avertissement.J'ai pensé que je pourrais passer l'information que ma liste contient des chaînes à la méthode. – kukudas