Comment puis-je exiger qu’un paramètre générique soit un enum implémentant une interface?

Je ne suis pas convaincu à 100% que c’est une bonne idée, mais je suis tombé sur un code aujourd’hui mis en œuvre sous la forme:

class MyWidget <T extends Enum > { MyWidget(Map valueMap) { mValueMap = valueMap; } Map mValueMap; } 

MyWidget propose alors des méthodes utilisant mValueMap pour convertir le Enum transmis vers / depuis un Integer .

Ce que je pensais faire était d’essayer de refactoriser ceci, 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 pourrais alors réécrire MyWidget dans quelque chose qui ressemblait vaguement à ceci:

 public class MyWidget<T extends Enum extends MyInterface> { ... } 

et serait alors capable d’appeler la méthode getValue() de MyInterface sur T objects de type T dans MyWidget . Le problème, bien sûr, est que ” <T extends Enum extends MyInterface> ” n’est pas une syntaxe valide. Est-il possible de retirer cela?

Je ne veux pas simplement que MyWidget , car il est également important que T soit une énumération.

Merci d’avance!

Utilisez plutôt un ” & “:

 public class MyWidget & MyInterface> { ... } 

Le JLS appelle cela un “type d’intersection”, mais je ne peux en trouver aucune mention dans les tutoriels Java. Je dirai simplement que cela fait exactement ce que vous souhaitiez que ” extends ” ferait.

En outre, je dois mentionner que vous pouvez avoir autant de types que vous voulez dans le type d’intersection. Donc, si vous vouliez, vous pourriez faire:

 public class MyWidget & MyInterface & Serializable & Cloneable> { ... } 

[Remarque: cet exemple de code ne doit pas être interprété comme une approbation de l’interface Cloneable ; c’était simplement pratique à l’époque.]

Les nouvelles fonctionnalités de JSR 203 pour JDK 7 utilisent beaucoup les énumérations qui implémentent les interfaces (par exemple: http://openjdk.java.net/projects/nio/javadoc/java/nio/file/FileVisitOption .html ) pour leur permettre d’avoir une marge de manœuvre dans l’avenir pour de futurs ensembles d’options supplémentaires. C’est donc une approche réalisable et évidemment une approche qui a été choisie après beaucoup de reflection dans un grand projet Sun.