Java 泛型类的未检查类型转换?
我正在尝试编写一个方法,可以在运行时将字符串转换为通用枚举的枚举对象。我有一个方法签名:Java 泛型类的未检查类型转换?,java,generics,enums,Java,Generics,Enums,我正在尝试编写一个方法,可以在运行时将字符串转换为通用枚举的枚举对象。我有一个方法签名: public static <T extends Enum<T>> Enum<T> foo(String string, Class<T> clazz) 公共静态枚举foo(字符串、类clazz) 但是,我从一个类调用它,该类的泛型类型参数没有显式扩展Enum。i、 e class bar<X> { private Class<X&g
public static <T extends Enum<T>> Enum<T> foo(String string, Class<T> clazz)
公共静态枚举foo(字符串、类clazz)
但是,我从一个类调用它,该类的泛型类型参数没有显式扩展Enum。i、 e
class bar<X> {
private Class<X> clazz;
if (XIsAnEnum()) {
foo(string, clazz)
}
}
类栏{
私人课堂;
if(XIsAnEnum()){
foo(弦乐,克拉兹)
}
}
这不会编译,因为尽管我从XIsAnEnum
的逻辑中知道X扩展了Enum
,但我没有在泛型类型参数定义中明确说明这一点,因此它不是有效的参数
有没有办法从类
到类
执行未经检查的强制转换,或者我是否需要专门为我想使用枚举的时候创建一个新类bar2
foo("value", clazz.asSubclass(Enum.class));
这涉及实际验证clazz
是否引用了类
,该类是Enum
的子类
不过,您在这里放弃了所有的通用验证。您可以使用它来为您进行转换,如
foo("value", clazz.asSubclass(Enum.class));
这涉及实际验证clazz
是否引用了类
,该类是Enum
的子类
不过,您在这里放弃了所有通用验证。我觉得您缺少了一些代码。你所拥有的不会编译,因为你在一个方法中没有if语句。是的,实际上会有一些额外的代码,但这不会影响问题。字符串包含什么?如果它只是一个枚举常量的名称,您可以执行
MyEnum.valueOf(string)
来获取相应的MyEnum
常量,您不需要编写此方法。string是常量的名称,但MyEnum是通用的X。我觉得您缺少一些代码。你所拥有的不会编译,因为你在一个方法中没有if语句。是的,实际上会有一些额外的代码,但这不会影响问题。字符串包含什么?如果它只是枚举常量的名称,则可以执行MyEnum.valueOf(string)
以获取相应的MyEnum
常量,而无需编写此方法。string是常量的名称,但MyEnum是泛型X。