我有一个实现接口的枚举。枚举:
enum MyEnum implements MyInterface {
ONE, TWO, THREE;
@Override
public MyEnum getFirst() {
return ONE;
}
}
接口:
interface MyInterface<T extends Enum<T>> {
T getFirst();
}
我还有一个带边界的泛型类:
class MyClass <T extends Enum<T> & MyInterface> {
private T firstElement;
private Class<T> enumType;
MyClass (Class<T> enumType) {
this.enumType = enumType;
}
}
所以主要的想法是将任何enum
(实现MyIterface
)传递给构造函数,然后使用它的常量。这对我有用。但我也希望将第一个元素存储到firstElement
私有字段中。我试过这样的事情:
firstElement = ((MyInterface)enumType).getFirst();
但仍然没有成功。我无法将java.lang.Class<T>
投射到MyInterface
。任何想法如何实现这一目标?提前谢谢!
UPDATE :我的问题不在于如何获取第一个枚举常量。我知道.ordinal()
和.values()[0];
。我想创建可重用的泛型类,并将其用于任何枚举,由某些界面标记。
好吧,让它不是getFirst()
方法。设为getDefault()
答案 0 :(得分:1)
从您的上下文中我认为您需要getFirst()
,因为您想获得枚举的第一个值。但是,您根本不需要getFirst()
。所有你需要的是:
class <T extends Enum<T> & MyInterface> MyClass {
private T firstElement;
private Class<T> enumType;
MyClass (Class<T> enumType) {
this.enumType = enumType;
firstElement = enumType.getEnumConstants()[0];
}
}
您可以删除所有课程中的所有getFirst()
。
答案 1 :(得分:1)
您只能在实现getFirst
但不在其类上的枚举对象上调用MyInterface
。你可以写:
firstElement = enumType.getEnumConstants()[0].getFirst();
答案 2 :(得分:1)
我认为您可以使用os.kill(os.getpid(), signal.CTRL_C_EVENT)
作为构造函数的参数而不是Supplier<T>
:
Class<T>
该投射会抛出警告,但可以安全地予以抑制,因为class MyClass<T extends Enum<T> & MyInterface<T>> {
private T firstElement;
private Class<T> enumType;
@SuppressWarnings("unchecked")
MyClass (Supplier<T> enumSupplier) {
T actualEnum = enumSupplier.get();
this.enumType = (Class<T>) actualEnum.getClass();
this.firstElement = actualEnum.getFirst();
}
}
将返回Supplier<T>
的实例,T
同时为T
和{{1 }},因此Enum<T>
的类始终为MyInterface<T>
。
我想建议您进行一些更正:由于actualEnum
是通用的,因此您应始终将其与通用类型一起使用(这就是我将Class<T>
声明为MyInterface
的原因})。 MyClass
也是如此:它应该被定义为MyClass<T extends Enum<T> & MyInterface<T>>
。
通过上述更改,您现在可以创建MyEnum
的实例,如下所示:
MyEnum implements MyInterface<MyEnum>
答案 3 :(得分:0)
{{1}}
所以,使用上面的设计,我认为你可以将任何枚举(实现MyInterface)传递给构造函数,然后使用它的常量。&#34;