java - 如何要求泛型参数是实现接口(interface)的枚举?

标签 java generics enums

我不是 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()方法来自 MyInterfaceT -类型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/

相关文章:

swift - Int 和 Double 在 Swift 中共享一个公共(public)父类

java - 在java中实例化递归定义的复合泛型类

generics - 如何实现类似于 HashMap::entry 的不消耗 key 的功能?

c - 为什么我不能使用函数返回值作为参数?

php - Symfony2/Doctrine2 中的枚举启用问题

java - 正则表达式从 html 标签(嵌套)获取文本 - Java

java - 异步 Lambda 代理集成

class - 有没有办法在 Visio 2007 中表示枚举类?

java - 自动递增 ID 打破序列

java - 从 ArrayList 中移除项目,但 notifyDataSetChanged() 仅删除底部项目