如何将泛型参数作为实现接口的枚举?

Sbo*_*odd 46 java generics enums

我不是100%确信这是一个好主意,但我今天碰到了一些目前实现的代码:

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

  Map<T, Integer> mValueMap;
}
Run Code Online (Sandbox Code Playgroud)

其中,MyWidget然后提供使用方法mValueMap转换传入的Enum从一个到/ Integer.

我正在考虑做的是试图重构这个,以便我宣布我的枚举:

interface MyInterface {
  public Integer getValue();
}

enum MyEnum implements MyInterface {
  foo, bar;
  public Integer getValue() {
    return ordinal();
  }
}
Run Code Online (Sandbox Code Playgroud)

然后我就可以重MyWidget写成看起来像这样模糊的东西:

public class MyWidget<T extends Enum<T> extends MyInterface> {
  ...
}
Run Code Online (Sandbox Code Playgroud)

然后就可以getValue()从内部的MyInterfaceon T-type对象调用该方法MyWidget.当然,问题是" <T extends Enum<T> extends MyInterface>"不是有效的语法.有什么办法可以解决这个问题吗?

我不想这样做MyWidget<T extends MyInterface>,因为T是枚举也很重要.

提前致谢!

Mic*_*ers 86

使用' &'代替:

public class MyWidget<T extends Enum<T> & MyInterface> {
    ...
}
Run Code Online (Sandbox Code Playgroud)

JLS称这是"交集型",但我能找到在Java教程没有提到它.我只是说它完全符合你所希望的" extends".

另外,我应该提一下,你可以在交集类型中拥有任意数量的类型.所以,如果你想,你可以这样做:

public class MyWidget<T extends Enum<T> & MyInterface & Serializable & Cloneable> {
    ...
}
Run Code Online (Sandbox Code Playgroud)

[注意:此代码示例不应被视为对Cloneable接口的认可; 它在当时只是方便.]

  • 我倾向于同意(我想我已经使用过一两次,如果那样的话).但是在枚举实现接口的情况下,我认为这是合适的. (2认同)
  • 谢谢.你的帖子以某种方式让我意识到,我真正需要的是......`doSomething(Enum <?extends SomeInterface>)` (2认同)
  • +10从来没有想过我自己想出来的.处理带接口的枚举的唯一方法. (2认同)