【发布时间】:2016-07-22 13:28:09
【问题描述】:
我想在集合中存储一个名为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> {}
这是错误的。我只希望枚举能够实现这个接口,我该如何强制执行?
【问题讨论】:
-
你从编译器中得到了什么错误信息?请编辑您的帖子,以始终如一地向我们展示您的所有声明。
-
@MikeRobinson 他没有收到错误消息,这就是问题所在 - 他希望编译器抱怨最后的声明。 ;)
-
@MikeRobinson 再次阅读了这个问题。编译器没有错误。 OP 只是想限制实施者。
-
不是解决方案,但至少是一种改进:
interface App<T extends Enum<T> & App<T>>。使用您的版本,即使MyEnum没有实现App<MyEnum>,您也可以执行class Myclass implements Application<MyEnum>,因此通过改进,您至少可以阻止开发人员使用any 枚举。除此之外,是否有理由要求实现为枚举?是否有办法至少在运行时检查实际类上的isEnum()标志(例如,当传递App的实例时)? -
接口无法描述它们可以附加到哪些类型,它们只是描述了实现它们的类型的一些强制(保证)行为。您所描述的并不是该语言的真正特性,因此您将很难找到一种方法来创建您所追求的开发防御机制。