我想在集合中存储一个名为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> {}
哪个错了。我只希望枚举能够实现这个界面,我该如何强制执行呢?
答案 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>>
)Enum
已实施的方法,例如name()
,ordinal()
,getDeclaringClass()
等。App<T ...>
延长Comparable<T>
。getClass().isEnum()
来检查该属性。这并不理想,但有类似的常用解决方案,例如Collections.unmodifiableSet()
。