强制接口的实现者成为枚举

时间:2016-07-22 13:28:09

标签: java enums interface

我想在集合中存储一个名为App的类型。 App需要是实现App接口的枚举。

Set<App> myApps;

我已经定义了这样的界面......

interface App<T extends Enum<T>> {}

这几乎正常,例如,你不能这样做......

class MyClass implements Application<MyClass> {}

但是,你可以这样做......

enum MyEnum implements Application<MyEnum> {}
class Myclass implements Application<MyEnum> {}

哪个错了。我只希望枚举能够实现这个界面,我该如何强制执行呢?

2 个答案:

答案 0 :(得分:11)

定义一个方法,允许您将元素添加到集合中,但是对该参数使用约束...

 public <E extends Enum<E> & IMyInterface> void addToSet(final E value) { }

之后

addToSet(MyEnum.K) will compile

但是

addToSet(new Myclass()) will NOT compile

答案 1 :(得分:1)

AFAIK无法强制接口的实现者拥有某些属性,例如枚举。

但是,根据您的代码以及您如何使用该界面,您可能会使某些人难以使实现者成为枚举:

  • 要求T同时实施App<T>以防止将任何枚举传递给类声明(即App<T extends Enum<T> & App<T>>
  • 尽可能使用额外的边界(参见ΦXocę웃Пepeúpa的回答)
  • 添加Enum已实施的方法,例如name()ordinal()getDeclaringClass()等。
  • App<T ...>延长Comparable<T>
  • 如果可能,请在运行时调用getClass().isEnum()来检查该属性。这并不理想,但有类似的常用解决方案,例如Collections.unmodifiableSet()