2009-05-05 13 views
8

Estoy tratando de determinar el tipo de clase de una clase usando reflexión y luego hago algo específico. Por ejemplo, si la clase es doble, use un método doble específico.¿Cómo comparo clases usando la reflexión?

Estoy intentando utilizar


    if(f.getClass() == Double.class) 

Sin embargo, estoy consiguiendo un error del compilador:

"? Tipos de operando incompatibles Clase < captura # 1 de extiende Campo > y Clase <doble>"

¿Cuál es la forma correcta de hacerlo?

Editar: para ser más claro

f es de tipo de campo. obtenido por la reflexión en un bucle


    (Field f : instance.getDeclaredFields()) 

Respuesta

6

mensaje de error Interesante (no sabía operador '==' comprobaría aquellos). Pero basado en eso, sospecho que su comparación es incorrecta: está tratando de ver si la clase Field (teóricamente su superclase, pero solo en teoría - Field es final) es igual a Double.class, que no puede ser.

Entonces: sí, la comparación debería funcionar, si le da argumentos correctos. Por lo que sospecho que quiere hacer:

si (f.getType() == Double.class)

lugar. Y eso debería funcionar, dado que Double es una clase final. De lo contrario, "isAssignableFrom" sería más apropiado.

1

La forma más sencilla sería

if (f.getClass().equals(Double.class)) 

Editar: Ah, ahora veo el problema. El error que recibía era porque (como resultado de los genéricos) el compilador podía decir que las clases nunca serían iguales (Field.class no puede equivaler a Double.class). El uso de .equals() lo convierte en una advertencia en lugar de un error, pero sigue siendo un código incorrecto.

Field.getType() le proporciona el tipo de campo. Como esto no se puede conocer en tiempo de compilación, no obtendrá un error si usa el operador == como lo hizo originalmente.

+0

Esto no funciona de la manera que me gustaría. Gracias por la ayuda, me encontré con la respuesta y la publiqué. – kgrad

3

Si tiene objetos a continuación, utilizar el método

if (f instanceof Double) { } 

Otra cosa interesante es isAssignableFrom:

if (f.getClass().isAssignableFrom (Double.class)) { } 

Pero, en general, se trata de un mal estilo. Usa el polimorfismo para implementar la lógica que depende de los tipos de clases.


Respuesta para comentario: f instanceof Double funciona bien.

Probablemente escribió algo como esto:

float f = 1.1f; 
if (f instanceof Double) { ..} 

e inteligente Java compilador dice que tienes la CE. PERO:

public static boolean isInstanceOfDouble (Object obj) { 
    return obj instanceof Double; 
} 

psvm (String [] args) { 
    sout (isInstanceOfDouble (1.1f); 
} 

..la funciona bien

+0

Eso no siempre es lo mismo. Si Double no fuera una clase final, las dos serían diferentes si f fuera una subclase. –

+0

f instanceof Double da un error de compilación. – kgrad

+0

Sí, como pueden ver escribí "interesante", significa "leer javadocs para más detalles". De todos modos prefiero las soluciones OOP – Roman

1

Debería utilizar getType() para obtener el tipo subyacente, no consigue clase. getType() devuelve la clase del tipo subyacente según sea necesario.

el código es el siguiente:


    if(f.getType().equals(Double.class)) 
+0

Esa es la respuesta a una pregunta completamente diferente. getType() es específico de la clase Field, mientras que getClass() se aplica a todos los objetos. –

+0

La pregunta es específica para la reflexión ... – kgrad

+0

¿Pero notaron que tanto Roman como yo dimos respuestas que no tenían sentido? Ambos estábamos respondiendo tu pregunta original. (He actualizado mi respuesta para explicar el verdadero problema aquí.) –

0

siguiente fragmento de código debe funcionar a la perfección:

if (f.getType() == Double.TYPE) 

Por cierto, ni == ni equals obras de Número tipos según mi prueba (JRE7)

Cuestiones relacionadas