我正在读这篇文章:
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
为什么这会导致错误,而不是简单地导致
instanceof
返回 false?
instanceof
检查是运行时检查。编译器能够在编译时(更早的时候)发现这个条件不正确,因此它告诉您它是错误的。永远记住,快速失败是一种很好的练习,它会节省你大量的时间和精力。
我会这么说,因为你在编译时就知道它永远不会是真的。因此,可以肯定地认为这不是程序员的意思:)
但是,可能有更多 Java 技术的解释。
因为编译器知道 Element 不可能是 Point,所以会出现编译错误。
因为继承树。如果 A 继承自 B 那么你可以编写 B 的 A 实例
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