Je ne suis pas convaincu à 100% que ce soit une bonne idée, mais je suis tombé sur un certain code aujourd'hui qui est actuellement mis en œuvre comme:Comment puis-je exiger qu'un paramètre générique soit une énumération qui implémente une interface?
class MyWidget <T extends Enum<T> > {
MyWidget(Map<T, Integer> valueMap) {
mValueMap = valueMap;
}
Map<T, Integer> mValueMap;
}
où MyWidget
offre alors des méthodes qui utilisent mValueMap
pour convertir le passé en Enum
vers/depuis un Integer
.
Ce que je considérais faire était d'essayer de factoriser cela, de sorte que je déclare mon énumération:
interface MyInterface {
public Integer getValue();
}
enum MyEnum implements MyInterface {
foo, bar;
public Integer getValue() {
return ordinal();
}
}
Et je alors en mesure de réécrire MyWidget
en quelque chose qui ressemblait vaguement à ceci:
public class MyWidget<T extends Enum<T> extends MyInterface> {
...
}
et serait alors en mesure d'appeler la méthode getValue()
de MyInterface
sur T
-type objets dans MyWidget
. Le problème, bien sûr, est que "<T extends Enum<T> extends MyInterface>
" n'est pas une syntaxe valide. Y a-t-il un moyen de retirer cela?
Je ne veux pas simplement avoir MyWidget<T extends MyInterface>
, car il est également important que T soit une énumération.
Merci d'avance!
La syntaxe & est soignée, mais je trouve que l'utiliser se transforme généralement en une odeur de code, et est une indication que quelque chose ne va pas tout à fait avec votre modèle. – skaffman
J'ai tendance à être d'accord (je pense que je l'ai utilisé peut-être une ou deux fois, si cela). Mais dans le cas des enums implémentant une interface, je pense que c'est approprié. –
Excellent! C'est exactement ce que je cherchais. Merci beaucoup! – Sbodd