通用枚举解析器没有未经检查的警告

Aub*_*bin -1 java generics enums warnings

如何删除@SuppressWarnings("unchecked")以下代码?

public <T extends Enum<T>> T getEnum( String key, T dflt ) {
   final String value = properties.getProperty( key, dflt.name());
   @SuppressWarnings("unchecked")
   final Class<T> clazz = (Class<T>)dflt.getClass();
   return Enum.valueOf( clazz, value );
}
Run Code Online (Sandbox Code Playgroud)

gle*_*e8e 5

所有Enum<E>子类都有一个返回Class正确参数化的方法.

public <T extends Enum<T>> T getEnum(String key, T dflt) {
    final String value = properties.getProperty(key, dflt.name());
    final Class<T> clazz = dflt.getDeclaringClass();
    return Enum.valueOf(clazz, value);
}
Run Code Online (Sandbox Code Playgroud)

编辑:你以前的解决方案是错误的,而不仅仅是糟糕的风格.

public final Class<E> getDeclaringClass()
Run Code Online (Sandbox Code Playgroud)

返回与此枚举常量的枚举类型对应的Class对象.当且仅当e1.getDeclaringClass()== e2.getDeclaringClass()时,两个枚举常量e1和e2具有相同的枚举类型.(此方法返回的值可能与Object.getClass()方法返回的值不同,对于具有常量特定类主体的枚举常量.)

Enum.valueOf(Class, String)如果Class传入的是Class"具有常量特定类体的枚举常量" ,则可能会抱怨.Class.isEnum()将返回false这些课程.