2012-09-06 18 views
51

Cuando compilar y ejecutar este código:Java - Objeto instanceof nula se evalúa como verdadera y falsa

public class Testing { 
    public static void main(String... args) { 
     Object obj = null; 
     if (obj instanceof Object) { 
      System.out.println("returned true"); 
     } else { 
      System.out.println("returned false"); 
     } 
     System.out.println(" " + obj instanceof Object); 
    } 
} 

consigo esto en la línea de comandos:

C:\Users\xxxxxx\Desktop>java Testing 
returned false 
true 

no debe "instanceof nula someType "siempre devuelve falso?

+2

Un rompecabezas similares; ¿Cuándo es 'x + 0! = X'? Por cierto, espera que el '+' tenga una mayor precedencia. –

+30

BTW: Podría haber sospechado cuando java imprimió true y no true – Jonathan

+4

Creo que el título es un poco erróneo, a menos que sea Java Quantum Edition y 'instanceof' haya devuelto un quboolean. –

Respuesta

102

Este:

" " + obj instanceof Object 

se evalúa como:

(" " + obj) instanceof Object 

y " " + obj es de hecho una cadena no nula que es una instancia de Object.

+23

Esta es una buena lección en" más parens son mejores que menos cuando la precedencia del operador no es cegadoramente obvia ". '" "+ (obj instanceof Object)' hubiera impreso el valor que esperaba. – yshavit

+2

Buen punto. Este es el tipo de comportamiento contra-intuitivo que puedes estudiar en _Java Puzzlers_ de Joshua Block y Neal Gafter. –

+0

@yshavit ... o use 'String.valueOf (Object)' y no '" "+ ...' cuando desee la representación de String. –

2

En el último System.out.println, la " " + obj evalúa primero y el resultado, que es un String está marcada para el instanceof Object y el resultado se imprime.

Cuestiones relacionadas