已提供的示例代码(我试图在上述问题中从内存中复制,显然无法按预期工作,因为枚举本身不能是通用的。
但是根据原始海报试图完成的任务,下面可能会提供正在寻找的内容,并且它确实可以编译和运行。
public enum Test {
TEST1(String.class),
TEST2(Object.class),
;
Class clazz;
Test(Class<?> clazz) {
this.clazz = clazz;
}
<T> T getInstance() throws IllegalAccessException, InstantiationException {
return (T)clazz.newInstance();
}
public static void main(String[] args) {
try {
String str = TEST1.getInstance();
Object obj = TEST2.getInstance();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
}
这里写的有一些明显的缺陷。根据您为每个枚举值提供的类型,可能没有可用的无参数构造函数。如果需要解决该问题,可以通过使用 Objenesis 使其变得更加复杂。此外,我“巧妙地”将方法的返回类型设置为 generic ,以便可以在没有警告/错误的情况下对其进行分配。但是,这样做是完全非类型安全的。您可以在没有编译器错误的情况下反转分配:
String str = TEST2.getInstance();
Object obj = TEST1.getInstance();
但是你得到一个运行时 ClassCastException。
无论如何,我认为我已经证明了泛型方法可以写在枚举中,而且可以在枚举中编写一个方法,该方法基于与每个静态关联的类型返回不同类类型的新实例枚举值(只是不作为每个枚举值的通用参数)。