2009-10-30 11 views
10

Me gustaría obtener una mejor comprensión del comportamiento isAssignableFrom en Java entre tipos primitivos y de referencia.isAssignableFrom con referencia y tipos primitivos

Ej:

System.out.println(boolean.class.isAssignableFrom(Boolean.class)); // false 
System.out.println(Boolean.class.isAssignableFrom(boolean.class)); // false 

boolean primitive; 
Boolean referenceType = true; 
primitive = referenceType; 
System.out.println(primitive); // true 

sé que al asignar primitivas < -> referencia que el boxeo/unboxing se produce según sea necesario, pero yo habría pensado que, por lo tanto isAssignableFrom volvería cierto en los primeros dos ejemplos anteriores.

¿Podría alguien explicar por qué devuelve falso, y cuál es la prueba adecuada aquí?

Respuesta

11

no se puede realidad asignar un valor a una variable booleanBoolean - pero se puede convertir de boolean a Boolean usando auto-boxing.

El JavaDocs hacen las reglas bastante claro:

Determina si la clase o interfaz representado por este objeto clase es ya sea el mismo que, o es una superclase o superinterfaz de la clase o interfaz representada por el parámetro de clase especificado. Devuelve verdadero si entonces; de lo contrario, devuelve falso. Si este objeto de clase representa un tipo primitivo , este método devuelve verdadero si el parámetro de clase especificado es exactamente este objeto de clase; de lo contrario, devuelve falso.

6

El javadocs from 1.4 ya especificar que:

Si este objeto clase representa un tipo primitivo, este método devuelve verdadero si el parámetro clase especificada es exactamente este objeto Clase; de lo contrario, devuelve falso.

Por lo tanto, el comportamiento de este método se bloqueó en su lugar antes de que se introdujera el auto boxeo, y no se puede cambiar (un nuevo método tendría que ser introducido).

Dado este bug report, es bastante evidente que no todos los casos de borde alrededor del objeto de clase y cómo las expectativas de cambios de auto boxeo se manejaron por completo.

Para responder a la segunda parte de su pregunta, la única forma que conozco de probar este caso es una serie de sentencias if o algún mecanismo de resolución similar que "encapsula" el tipo de clase primitiva.

Cuestiones relacionadas