2009-05-21 5 views
5

Je suis assez à l'aise avec les génériques et autres, mais dans ce cas particulier, j'ai une question concernant l'avertissement "Type de sécurité: non fonte de .. à ..".Type de sécurité: Coulée incontrôlée entre Class-Objects

Fondamentalement, j'avoir une liste d'objets de classe et maintenant je veux obtenir un sous-ensemble de ces qui mettent en œuvre une interface spéciale, mais la liste qui en résulte devraient également avoir ce type spécial:

... 
private List<Class<?>> classes; 

public List<Class<? extends Concrete>> getConcreteClasses() { 

    List<Class<? extends Concrete>> concreteClasses = new LinkedList<Class<? extends Concrete>>(); 

    for (Class<?> clazz: this.classes) { 
     for (Class<?> i : clazz.getInterfaces()) { 
      if (i.equals(Concrete.class)) { 
       concreteClasses.add((Class<? extends Concrete>) clazz); 
      } 
     } 
    } 

    return concreteClasses; 

} 

L'avertissement est bien sûr en rapport avec la distribution de type:

Type safety: Unchecked cast from Class<?> to Class<? extends Concrete> 

Puis-je me débarrasser de la distribution de type ou devrais-je supprimer l'avertissement avec @SuppressWarnings (« non contrôlée »)?

Merci pour les réponses!

PS: L'environnement est Java 6.

Solution: Au lieu de

concreteClasses.add((Class<? extends Concrete>) clazz); 

utilisation

concreteClasses.add(clazz.asSubclass(Concrete.class)); 
+0

Excellente réponse, sauvé ma vie ici. –

Répondre

5
+0

Merci! En fait j'ai déjà utilisé asSubclass() dans un autre morceau de code .... ooops: D – letmaik

+0

Ne soyez pas surpris si vous avez besoin de supprimer des avertissements ailleurs en utilisant la réflexion. (Comme toujours, la réflexion est mauvaise.) –

0

Vous pouvez supprimer les mises en garde, parce que vous êtes sûr que la fonte travaillera parce que toutes les classes que vous ajoutez implémenter l'interface concrète ...