2010-02-04 5 views
4

Prenez la méthode suivante, qui renvoie juste une carte de champs par nom:Comment éviter ces médicaments génériques java avertissement

public static <T> HashMap< String, Field > getFields(Class<T> klass) { 
    HashMap< String, Field > fields = new HashMap< String, Field >(); 
    for (Field f : klass.getFields()) { 
     fields.put(f.getName(), f); 
    } 
    return fields; 
} 

La méthode se comporte de manière identique si vous supprimez la saisie générique dans la signature de la méthode, à l'exception que vous obtenir un avertissement pour l'utilisation d'un type brut. J'ai rencontré d'autres choses similaires, surtout autour de la réflexion, où vous n'avez pas nécessairement le type d'entrée. Il semble que la réflexion va naturellement avoir des problèmes avec les génériques, étant donné que la réflexion est construite pour vous permettre de travailler avec des objets lorsque vous ne savez pas (ou ne vous intéressez pas) au type. En plus de simplement coller un "@SuppressWarning" sur tout, quelqu'un a-t-il de bonnes idées sur une manière plus élégante de gérer la réflexion sans être constamment grondé par les génériques?

+0

J'ai dû faire face à cela avant, mais ne me souviens pas du haut de ma tête, voici un bon tutoriel sur les génériques de Sun. http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf Si personne d'autre ne répond au moment où je rentre à la maison, je vais ouvrir mon ancien livre CS2 et essayer d'aider. Ça fait longtemps que j'ai vraiment fait des génériques Java. – Aaron

+0

Fait intéressant, le compilateur Eclipse est totalement bien avec votre code - aucun avertissement du tout. Ce n'est pas la première fois que javac et Eclipse ne sont pas d'accord sur les génériques ... – netzwerg

+0

Vous pouvez avoir des avertissements d'éclipse éteints. Je reçois un avertissement "type brut" en éclipse. –

Répondre

5

Qu'en est-ce (vous n'avez pas besoin du paramètre de modèle T, vous pouvez sauter):

public static HashMap< String, Field > getFields2(Class<?> klass) { 
    HashMap< String, Field > fields = new HashMap< String, Field >(); 
    for (Field f : klass.getFields()) { 
     fields.put(f.getName(), f); 
    } 
    return fields; 
} 
4

Effective Java, Chapter 5 (Generics):

  • Ne pas utiliser les types premières dans le nouveau code
  • Privilégier les méthodes génériques

Alors - ne retirez pas le paramètre de type.

+0

+1 pour une réponse succincte. – fastcodejava

+1

Le problème est plus que vous devez spécifier un paramètre de type qui n'a pas de but. –