当用于2个不兼容的类时,为什么`instanceof`错误而不是返回`false`?

我正在读这个:
http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.20.2

他们说:

考虑示例程序:

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 } } } 

instanceof表达式是不正确的,因为没有Element实例或其任何可能的子类(这里没有显示)可能是Point的任何子类的实例。

为什么这会导致错误,而不是简单地在返回false的情况下?

谢谢,

JDelage

instanceof check是运行时检查。 编译器能够在编译时发现这个条件不正确(更早),因此它告诉你它是错误的。 永远记住,快速失败是一种很好的做法,它会为你节省大量的时间和精力。

我会说,因为你在编译时知道它永远不会是真的。 因此,可以安全地假设这不是程序员的意思:)

但是,可能还有更多java技术解释。

因为编译器知道Element不可能是一个Point,所以你得到一个编译错误。

因为inheritance树。 如果Ainheritance自B,则可以编写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