¿Cómo eliminar @SuppressWarnings("unchecked") en el siguiente código?

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 );
}
-1
Aubin 14 dic. 2016 a las 15:43
Esta línea: final Class clazz = (Class ) dflt.getClass (); solo prevenga por una advertencia. No puedes eliminar eso porque este elenco no es seguro.
 – 
thepaulo
14 dic. 2016 a las 15:46
1
No está muy claro lo que está preguntando. ¿Quiere que el código se compile sin advertencias y también sin tener la anotación SuppressWarnings?
 – 
user152468
14 dic. 2016 a las 15:47
1
Pero creo que también puedes usar: final Class clazz = dflt.getDeclaringClass ();
 – 
thepaulo
14 dic. 2016 a las 15:49

1 respuesta

La mejor respuesta

Todas las subclases Enum<E> tienen un método que devuelve su Class que está correctamente parametrizado.

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);
}

EDITAR: Su solución anterior es INCORRECTA, no solo de mal estilo.

public final Class<E> getDeclaringClass()

Devuelve el objeto Class correspondiente al tipo de enumeración de esta constante de enumeración. Dos constantes de enumeración e1 y e2 son del mismo tipo de enumeración si y solo si e1.getDeclaringClass () == e2.getDeclaringClass (). (El valor devuelto por este método puede diferir del devuelto por el método Object.getClass () para las constantes enum con cuerpos de clase específicos de la constante).

Enum.valueOf(Class, String) puede quejarse si el Class pasado es el Class para "constantes de enumeración con cuerpos de clase específicos de constantes". Class.isEnum() devolverá false para esas clases.

5
glee8e 14 dic. 2016 a las 18:33