2010-06-09 14 views
6

Digamos que tengo un simple enumeración llamada Animal define como:¿Cómo obtengo el nombre de clase "valueOf"?

public enum Animal { 
    CAT, DOG 
} 

y tengo un método como:

private static Object valueOf(String value, Class<?> classType) { 
    if (classType == String.class) { 
     return value; 
    } 

    if (classType == Integer.class) { 
     return Integer.parseInt(value); 
    } 

    if (classType == Long.class) { 
     return Long.parseLong(value); 
    } 

    if (classType == Boolean.class) { 
     return Boolean.parseBoolean(value); 
    } 

    // Enum resolution here 

}

Qué puedo poner dentro de este método para devolver una instancia de mi enum donde el valor es del classType?

He mirado tratar:

if (classType == Enum.class) { 
     return Enum.valueOf((Class<Enum>)classType, value); 
    } 

Pero eso no quiere trabajar.

Respuesta

8

Su classType no es Enum, es Animal. Por lo tanto,

if (classType.isEnum()) { 
    return Enum.valueOf(classType, value); 
} 

debería funcionar. Además, debe utilizar equals() en lugar de == para comparar las instancias de clase (aunque == funcionará en la práctica, si solo hay un cargador de clases).

+2

Pero Class no anula equals(), por lo que supongo que equals() tampoco funcionará si hay varios cargadores de clases. – waxwing

+1

Umm, supongo que tienes razón. En realidad, no sé cómo los cargadores de varias clases funcionan juntos, ni si es realmente probable (o incluso posible) que existan varias instancias del mismo objeto de clase. Quizás 'Class # isAssignableFrom()' podría ser utilizado también. Dicho esto, usar 'igual()' no es malo. –

Cuestiones relacionadas