调用枚举.<T> valueOf()给出未经检查的强制转换警告,尽管T被声明为<T extends Enum <T >>

ali*_*ind 4 java generics enums

这必须是小事,但我没有得到它.

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

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);
   }
}
Run Code Online (Sandbox Code Playgroud)

编译器警告:

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
Run Code Online (Sandbox Code Playgroud)

它也发生在一个或两个泛型从函数调用中删除,例如

Enum.valueOf(for_value.getClass(), value);
Run Code Online (Sandbox Code Playgroud)

这是我发现的最接近的问题:Enum.valueOf会针对扩展Enum的未知类型类型发出警告?.这个枚举的类型是众所周知的.

Lou*_*man 8

您应该调用getDeclaringClass(),这也将修复泛型问题(指定返回Class<T>).getClass()使用自己定义的方法调用枚举常量实际上可以从枚举类型返回不同的类.