46 votes

Comment puis-je exiger qu'un paramètre générique soit une énumération qui implémente une interface?

Je ne suis pas convaincu à 100% que c'est une bonne idée, mais je suis tombé sur un code aujourd'hui qui est actuellement mis en œuvre comme:

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

  Map<T, Integer> mValueMap;
}

MyWidget puis propose des méthodes qui utilisent des mValueMap pour convertir le passé- Enum d'une Integer.

Ce que j'envisage de le faire était d'essayer de revoir ce, de sorte que je devais déclarer mes énumération:

interface MyInterface {
  public Integer getValue();
}

enum MyEnum implements MyInterface {
  foo, bar;
  public Integer getValue() {
    return ordinal();
  }
}

Et je ne puis être en mesure de réécrire MyWidget dans quelque chose qui ressemblait vaguement comme ceci:

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

et serait alors en mesure d'appeler l' getValue() méthode de MyInterface sur T-type des objets au sein d' MyWidget. Le problème, bien sûr, est que "<T extends Enum<T> extends MyInterface>" n'est pas valide la syntaxe. Est-il possible d'en sortir?

Je ne veux pas juste MyWidget<T extends MyInterface>, parce que c'est aussi important que T être une énumération.

Merci à l'avance!

86voto

Michael Myers Points 82361

Utiliser un '&"à la place:

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

Le JLS appelle cela une "intersection type", mais je ne peux trouver aucune mention de cela dans la Java des tutoriels. Je vais juste dire que c'est exactement ce que vous étiez en souhaitant que "extends" allait faire.

Aussi, je dois mentionner que vous pouvez avoir autant de types que vous le souhaitez dans l'intersection type. Donc, si vous le vouliez, vous pourriez faire:

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

[Note: cet exemple de code ne doit pas être interprétée comme une approbation de l' Cloneable interface; c'était simplement à portée de main à l'époque.]

1voto

Alex Miller Points 28225

La JSR 203 (new new IO) des trucs pour JDK 7 est beaucoup de l'utilisation des énumérations qui implémentent les interfaces (par exemple: http://openjdk.java.net/projects/nio/javadoc/java/nio/file/FileVisitOption.html) afin de leur permettre une certaine marge de manœuvre dans l'avenir pour l'avenir, d'autres groupes d'enum options. C'est donc une approche possible et, évidemment, celui qui a été choisi après beaucoup de pensée dans un grand Soleil du projet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X