2010-07-23 3 views
2

J'ai une classe EnumConverter<T extends Enum<?>> qui convertit les chaînes à la constante enum correcte pour l'énumération T (je ne peux pas utiliser Enum.valueOf). Je construis des instances de cette classe dans une méthode de fabrication comme ceci:Méthode d'usine statique avec génériques

public static <T extends Enum<?>> EnumConverter<T> getInstance(Class<T> enumClass) { 
    return new EnumConverter<T>(enumClass.getEnumConstants()); 
} 

Cela fonctionne, mais maintenant je veux mettre en cache EnumConverter cas pour vous assurer qu'il n'y a qu'un seul par ENUM, soit avec un Map, et mon problème est comment déclarer Map. Le plus proche que je suis venu est ceci:

private static final Map<Class<?>, EnumConverter<? extends Enum<?>>> 

Mais je reçois une erreur si je tente de retourner une valeur de ce Map de ma méthode d'usine:

Type mismatch: cannot convert from EnumConverter<capture#1-of ? extends Enum<?>> to EnumConverter<T>

Toutes les idées ?

Répondre

2

Comme vous voulez stocker différents types de sous dans la carte, le compilateur ne peut pas savoir quel sous-type réel que vous recevez. Je pense que vous devez ajouter une distribution:

public static <T extends Enum<?>> EnumConverter<T> getInstance(Class<T> enumClass) { 
    return (EnumConverter<T>) cache.get(enumClass); 
} 
+0

Merci, ça marche! Mais je reçois toujours un avertissement: 'sécurité Type: non contrôlé coulé à partir EnumConverter > pour EnumConverter '. Mais ce n'est probablement pas possible d'adresser en raison de l'effacement de type? – hakos

+0

La réponse est en effet '@SuppressWarnings ("non contrôlée")': http://stackoverflow.com/questions/262367/type-safety-unchecked-cast – hakos

Questions connexes