Si j'ai un ensemble d'énums, et que je veux les faire mettre en œuvre une interface, est-ce la bonne façon de faire de manière générique?
ENUM: P>
public class SkillsSet<T extends SkillType> { T t; Map<T,Integer> skills = new HashMap<>(); public SkillsSet(String[] skills) { for (String string : skills) { addSkill(string,t.getUntrainedPenalty()); } } private void addSkill(String skillString,Integer value) { skills.put((T) t.fromValue(skillString), 0); } }
4 Réponses :
ici la valeur ou plus clairement p> si vous envisagez d'avoir plus de types d'énumération qui implémentent de la valeur (valeur) code> est une statique, elle n'est pas associée à une instance Enum, ce qui signifie que vous ne pouvez pas l'appeler génériquement. Ce que vous pouvez faire: p>
SkillType code> Ensuite, vous avez besoin d'une usine sur ces types. Cependant, dans ce cas, Enum n'est probablement pas la meilleure décision de conception. P> p>
Le problème avec ces "solutions" est que vous êtes câblé dans un spécifique code>. Je soupçonne qu'ils vous donneront des erreurs de compilation. Par exemple,
mentalskill.values () [0] code> donne un
mentalskills code>, ce qui n'est pas nécessairement une instance du
t code> que vous avez instancié < Code> Skillset Code> avec,
Le problème vient dans mon t T T qui donnera évidemment une NPE car je n'instancite pas mon type déduit. Le problème est que je ne peux pas, car c'est un énumé. P>
En fait, vous ne pouviez même pas si c'était une classe "régulière"! Il n'est pas possible de créer des instances d'un type de paramètre au sein d'une classe générique ... Sauf si vous ne passez pas dans un objet
code> comme paramètre explicite. P> dans le cas d'un
Enum code>, vous devez soit transmettre une valeur du
Enum code> ou transmettre la classe
code> pour le Enum code> et utilisez le
Enum
.valueof (classe , chaîne) code> méthode pour faire une recherche. p> quelque chose comme ça serait nécessaire .... p>
xxx pré> mais les compétences
code> ne font pas beaucoup de sens pour moi. Pourquoi utiliseriez-vous la "pénalité non entraînée" pour une instance
t code> pour initialiser la valeur de compétence de toutes les compétences? Cela a plus de sens si c'est quelque chose de plus comme ceci: p>
xxx pré> Vous instanceriez un
Skillset code> comme ceci: P>
SkillSet<MentalSkill> st = new SkillSet<>(new String[]{"COMPUTER", "OCCULT"}, MentalSkill.class);
Cela semble plus prometteur que j'espérais!
@PureFerret - Vérifiez que tout cela compile. Si c'est le cas, je suis assez confiant que cela fonctionnera.
Ce code ne compile pas, mon Java / Eclipse ne reconnaît pas Enum t t = ENUM
Maintenant, la valeurOf se plaint d'une inadéquation liée. Type déduit T n'est pas un substitut valide du paramètre limité
Votre problème réside dans Ceci s'appelle un auto référencage em> paramètre générique. p> Sans cette auto-référence, vous pouvez renvoyer une instance de la classe différente em> à partir de la méthode Voici comment ça regarderait: p> et p> une fois que vous avez effectué ce changement, il devrait tous tomber en place. P > p> Stabilitype code> - il devrait être générique:
fromvalue () code>. p>
Cela semble mieux, mais cela ne fonctionnera pas même avec ce changement.
J'ai vu le modèle "Paramètre générique d'auto-référencement" utilisé mais je ne connaissais pas le nom pour cela.
Une solution consiste à utiliser la réflexion. Je ne suis pas sûr s'il y a d'autres solutions qui pourraient avoir l'air plus propre. Ce qui suit est compilé et exécuté cependant. Il existe deux versions différentes de instantifiant les travaux ci-dessus avec
getenumvalue code>. Je recommanderais la version qui utilise la méthode code> getenumConstants code> sur le paramètre
Enumclass code>. Il vous permet également de gérer des cas spéciaux dans
devalue code> qui pourraient ne pas correspondre généralement à la fonction
de l'ENum code>. P>
Comformsetssets
Pourquoi ne pas passer dans un
t [] code> au lieu d'une chaîne
[] code>?
Parce que je ne peux pas stocker T [] dans le fichier, mais je peux avec des chaînes dans un document texte.