Java 调用枚举;T>;valueOf()给出未经检查的强制类型转换警告,尽管声明了T<;T扩展枚举<;T>&燃气轮机;

Java 调用枚举;T>;valueOf()给出未经检查的强制类型转换警告,尽管声明了T<;T扩展枚举<;T>&燃气轮机;,java,generics,enums,Java,Generics,Enums,这一定很小,但我不明白 当它与Enum中的泛型声明完全相同时,为什么会导致未经检查的强制转换编译器警告 这是我发现的最接近的问题:。此枚举的类型是已知的。生成未检查警告的是getClass调用,而不是enum\valueOf。这是因为getClass返回一个Class类,它的规范是一个特例,并且: 实际结果类型为类指定: 实际结果类型是类,其中| X |是对调用getClass的表达式的静态类型的擦除 泛型类型T的返回类型是Object,因此_value的。getClass()的返回类型是Cla

这一定很小,但我不明白

当它与
Enum
中的泛型声明完全相同时,为什么会导致未经检查的强制转换编译器警告


这是我发现的最接近的问题:。此枚举的类型是已知的。

生成未检查警告的是
getClass
调用,而不是
enum\valueOf
。这是因为
getClass
返回一个
Class
类,它的规范是一个特例,并且:

实际结果类型为
类指定:

实际结果类型是类,其中| X |是对调用getClass的表达式的静态类型的擦除


泛型类型
T
的返回类型是
Object
,因此_value的
。getClass()
的返回类型是
Class,您应该调用
getDeclaringClass()
,这也将解决泛型问题(它被指定为返回
Class
)。对定义了自己的方法的枚举常量调用
getClass()
,实际上可以返回与枚举类型不同的类。

我实际上应该返回
T
,而不是
enum
,尽管这不会停止警告。是的,我只是在胡闹,它失败了。这是Enum的声明方式,很痛苦,我忘记了这一点
getClass
返回原始的
?扩展枚举
。我马上就要编辑了。递归泛型很麻烦。谢谢你的帮助,@Radiodef。那么有没有办法避免未经检查的强制转换呢?你可以将
类clazz
参数传递给该方法——这将是标准方法。我想你可以忽略这个警告(使用
SuppressWarnings(“unchecked”)
),但我必须考虑一下才能确定。太棒了!非常感谢。下面是一个相关的答案:,以及
getDeclaringClass
API:这就是答案。:)因此,
与该枚举的值的类不同。(我会再说一遍,不管它是否相关:递归泛型是一种痛苦!)再次感谢。
public static final <T extends Enum<T>> Enum toValue(T for_value, String value)  {
   try  {
      return  Enum.<T>valueOf((Class<T>)for_value.getClass(), value);
   }  catch(RuntimeException rx)  {
      throw  new IllegalArgumentException(value);
   }
}
R:\jeffy\programming\sandbox\xbnjava\xbn\util\EnumUtil.java:92: 
warning: [unchecked] unchecked cast
         Enum.<T>valueOf((Class<T>)for_value.getClass(), value);
                                                     ^
  required: Class<T>
  found:    Class<CAP#1>
  where T is a type-variable:
    T extends Enum<T> declared in method <T>toValue(T,String,String)
  where CAP#1 is a fresh type-variable:
    CAP#1 extends Enum from capture of ? extends Enum
R:\jeffy\programming\sandbox\xbnjava\xbn\util\EnumUtil.java:98: error: missing return statement
   }
   ^
1 error
1 warning
Enum.valueOf(for_value.getClass(), value);
@SuppressWarnings("unchecked")
Class<? extends E> cls = (Class<? extends E>)for_value.getClass();