1

不久前有人问了一个问题,该问题被召回,因为它被否决了。很明显,枚举本身不能是通用的,但问题标题是“通用枚举方法”,这当然可能的。最初的问题有一些示例伪 Java 代码,类似于:

enum Test<T> {
    TEST1<T1>,
    TEST2<T2>,
    TEST3<T3>;
    // I missed some details they had here for overriding methods or such

   public T getInstance() {...
      // somehow returning a T1 when called on TEST1, a T2 for TEST2, etc.
   }
}

我正在重新询问,因为我在下面有一个潜在的答案,可能是@Radu 的问题背后的问题。

4

1 回答 1

1

已提供的示例代码(我试图在上述问题中从内存中复制,显然无法按预期工作,因为枚举本身不能是通用的。

但是根据原始海报试图完成的任务,下面可能会提供正在寻找的内容,并且它确实可以编译和运行。

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。

无论如何,我认为我已经证明了泛型方法可以写在枚举中,而且可以在枚举中编写一个方法,该方法基于与每个静态关联的类型返回不同类类型的新实例枚举值(只是不作为每个枚举值的通用参数)。

于 2012-08-03T03:56:39.860 回答