2015-12-09 66 views
1

我想写一个方法,我可以在运行时将字符串转换为枚举对象,以用于泛型枚举。我有一个方法签名:未检查泛型类型的类型转换?

public static <T extends Enum<T>> Enum<T> foo(String string, Class<T> clazz) 

但是,我从一个类,它的泛型类型参数没有明确扩展枚举调用它。即

class bar<X> { 
    private Class<X> clazz; 
    if (XIsAnEnum()) { 
    foo(string, clazz) 
    } 
} 

这并不编译,因为即使我知道,从XIsAnEnum逻辑,即X extends Enum<X>,我没有明确说明这一点在泛型类型参数的定义,所以它不是一个有效的参数。

有没有办法从Class<X>Class<X extends Enum<X>>做一个未经检查的剧组演员,或者我将不得不在创建一个新的类bar2<X extends Enum<X>>,当我想使用枚举?

+1

我觉得你错过了一些代码。你有什么不会编译,因为你没有在方法中的if语句。 – Troncoso

+0

是的,在现实中会有一些额外的代码,但它不会影响问题。 –

+0

字符串包含什么?如果它只是一个枚举常量的名称,可以执行'MyEnum.valueOf(string)'来获得相应的'MyEnum'常量,并且不需要编写该方法。 – Jesper

回答

0

您可以使用Class#asSubclass(Class)做演员的你,喜欢

foo("value", clazz.asSubclass(Enum.class)); 

这涉及到一个实际的验证,即clazz是指一个Class那就是Enum一个子类。

虽然你在这里抛出所有的通用验证。