用于Java中不同枚举类的联合的switch语句

我有两个枚举类,比如Enum1和Enum2:

enum Enum1 {ONE, TWO, THREE} enum Enum2 {FOUR, FIVE} 

我有一个像这样的方法:

 public <E extends Enum> method (E arg) { switch (arg) { // Here is the compile error -- Cannot switch // on a value of type E. Only convertible int // values, strings or enum variables are permitted // (And of course, all the cases are incorrect // because the enum set is unknown) case ONE: // do something case TWO: // do something case THREE: // do something case FOUR: // do something case FIVE: // do something default: // do something } } 

那么可以切换generics枚举类型的值吗?


有一种方法可以将其更改为字符串(仅适用于JDK7):

 public <E extends Enum> method (E arg) { switch (arg.name()) { case "ONE": // do something case "TWO": // do something case "THREE": // do something case "FOUR": // do something case "FIVE": // do something default: // do something } } 

你无法做你想做的事。 首先, enum开关实际上是enumordinal()开关的简写。 因此,即使您可以让开关识别您的“联合枚举”类型,该语句也有重复的case分支。 (例如, ONEFOUR都有序数0.)

一种方法可能是将动作移动到枚举本身。 然后,您可以让每个enum类型实现一个通用接口:

 interface Actor { void doSomething(); } enum Enum1 implements Actor { ONE { public void doSomething() { . . . } }, TWO { public void doSomething() { . . . } }, THREE { public void doSomething() { . . . } } } enum Enum2 implements Actor { FOUR { public void doSomething() { . . . } }, FIVE { public void doSomething() { . . . } } } 

然后你可以实现你的方法来简单地将处理委托给actor:

 public void method(Actor actor) { if (actor == null) { // default action } else { actor.doSomething(); } } 

您需要在switch语句之前将枚举强制转换为特定类型(因此每种类型都有一个单独的switch语句)。 说,这不是最好的想法。 您可能会通过重构代码找到更好的解决方案,这样您就不需要这样做了。

你提到的开关显然不起作用。

我有一个(非常奇怪的)替换:创建一个“helper enum”,它包含列出的所有值,并且有一个Map, HelperEnum> ,如下所示:

 private enum HelperEnum { ONE(Enum1.ONE), TWO(Enum1.TWO), THREE(Enum1.THREE), FOUR(Enum2.FOUR), FIVE(Enum2.FIVE); private Enum source; private HelperEnum(Enum source) { this.source = source; } private static Map, HelperEnum> map; public static HelperEnum lookUp(Enum source) { if (map == null) { map = Arrays.stream(HelperEnum.values()) .collect(Collectors.toMap(x -> x.source, x -> x)); } return map.get(source); } 

(未经测试!)

这样你就可以做到

 switch(HelperEnum.lookUp(a_request)){ case ONE: .... case TWO: .... case THREE: .... case FOUR: .... case FIVE: .... } 

(类似版本首次发布在这里 )

有问题的枚举实现了一个通用接口会很有帮助,但是这个接口也可能有用。