我不是 100% 相信这是一个好主意,但我今天碰到了一些代码,目前实现如下:
class MyWidget <T extends Enum<T> > {
MyWidget(Map<T, Integer> valueMap) {
mValueMap = valueMap;
}
Map<T, Integer> mValueMap;
}
在哪里 MyWidget
然后提供使用 mValueMap
的方法转换传入的Enum
往返于 Integer
.
我正在考虑做的是尝试重构它,以便我声明我的枚举:
interface MyInterface {
public Integer getValue();
}
enum MyEnum implements MyInterface {
foo, bar;
public Integer getValue() {
return ordinal();
}
}
然后我就可以重写 MyWidget
变成看起来像这样的东西:
public class MyWidget<T extends Enum<T> extends MyInterface> {
...
}
然后就可以调用getValue()
方法来自 MyInterface
在 T
-类型MyWidget
中的对象.当然,问题在于“<T extends Enum<T> extends MyInterface>
”不是有效的语法。有没有办法解决这个问题?
我不想只拥有 MyWidget<T extends MyInterface>
,因为 T 是枚举也很重要。
提前致谢!
最佳答案
改用“&
”:
public class MyWidget<T extends Enum<T> & MyInterface> {
...
}
JLS将此称为“交叉类型”,但我在 Java 教程中找不到任何提及。我只想说它完全符合您希望“extends
”会做的事情。
另外,我应该提到,您可以在交集类型中拥有任意数量的类型。所以如果你愿意,你可以这样做:
public class MyWidget<T extends Enum<T> & MyInterface & Serializable & Cloneable> {
...
}
[注意:此代码示例不应被理解为对 Cloneable
接口(interface)的认可;它当时只是很方便。]
关于java - 如何要求泛型参数是实现接口(interface)的枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1070703/