2010-12-16 20 views
6

estoy leyendo esto:
http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.20.2¿Por qué `instanceof` error en lugar de devolver` false` cuando se usa para 2 clases incompatibles?

Dicen:

examinar el programa de ejemplo:

class Point { int x, y; } 
class Element { int atomicNumber; } 
class Test { 
     public static void main(String[] args) { 
       Point p = new Point(); 
       Element e = new Element(); 
       if (e instanceof Point) {  // compile-time error 
         System.out.println("I get your point!"); 
         p = (Point)e;   // compile-time error 
       } 
     } 
} 

La expresión instanceof es incorrecta porque ninguna instancia de Element o cualquiera de sus posibles subclases (ninguna se muestra aquí) podría ser una instancia de cualquier subclase de Point.

¿Por qué esto resulta en un error, en lugar de simplemente en instanceof devolviendo falso?

Gracias,

JDelage

+0

Parece que su experiencia anterior puede estar en los lenguajes que, en su mayoría, no se escribieron y se interpretaron en su mayoría (por ejemplo, la mayoría de los BASIC) en lugar de escribir y compilar fuertemente. Con un lenguaje que se interpreta principalmente, casi toda validación de tipo tipo ocurre en tiempo de ejecución. Sin embargo, con los lenguajes compilados, el compilador puede hacer bastante "análisis de flujo de tipo y ejecución". Como resultado, si encuentra rutas que nunca se pueden ejecutar, puede eliminar el código en esa ruta (es decir, eliminar el código inactivo). Y genera un error si encuentra una operación que nunca puede tener éxito. – chaotic3quilibrium

Respuesta

10

instanceof cheque es un cheque en tiempo de ejecución. El compilador puede descubrir que esta condición es incorrecta en el momento de la compilación (mucho antes), por lo que le indica que está equivocada. Recuerde siempre, que el ayuno fallido es una buena práctica, le ahorrará mucho tiempo y nervios.

+1

Gracias, esto explica lo racional de esta decisión. Tiene sentido, de hecho, cometer un error en el tiempo de compilación en lugar de tener un resultado 'falso' en el tiempo de ejecución. – JDelage

10

diría yo, porque usted sabe en tiempo de compilación que nunca va a ser verdad. Por lo tanto, es seguro asumir que esto no es lo que el programador quiso decir :)

Sin embargo, es probable que haya una explicación técnica java.

3

Porque el compilador sabe que es imposible que un elemento sea un punto, por lo que se obtiene un error de compilación.

0

Debido al árbol de herencia. si A hereda de B, entonces se puede escribir una instancia de B

Integer i = 3; 

System.out.println(i instanceof String); // compile time error 

System.out.println(i instanceof Number); // true 

System.out.println(i instanceof Object); // true 
Cuestiones relacionadas