Java 为什么在用于两个不兼容的类时,`instanceof`会出错,而不是返回`false`?

Java 为什么在用于两个不兼容的类时,`instanceof`会出错,而不是返回`false`?,java,inheritance,instanceof,Java,Inheritance,Instanceof,我正在读: 他们说: 考虑示例程序: instanceof表达式不正确,因为元素或其任何可能的子类(此处未显示)的实例都不可能是点的任何子类的实例 为什么这会导致错误,而不仅仅是在instanceof中返回false 谢谢 我想说的是JDelage,因为在编译时您知道它永远不会是真的。因此,可以安全地假设这不是程序员的意思:) 但是,可能还有一个更为java技术的解释。因为编译器知道元素不可能成为点,所以您会得到一个编译错误 因为继承树。如果A继承自B,则可以编写B的实例 Integer i

我正在读:

他们说:

考虑示例程序:

instanceof
表达式不正确,因为
元素
或其任何可能的子类(此处未显示)的实例都不可能是
的任何子类的实例

为什么这会导致错误,而不仅仅是在
instanceof
中返回false

谢谢


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


但是,可能还有一个更为java技术的解释。

因为编译器知道元素不可能成为点,所以您会得到一个编译错误

因为继承树。如果A继承自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

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

谢谢-这解释了这个决定的合理性。事实上,在编译时出错而不是在运行时产生
false
结果是完全有道理的。听起来您以前的经验可能是使用的语言大多是松散类型和解释(例如:大多数基础)的,而不是强类型和编译的。对于一种主要进行解释的语言,几乎所有类似类型的验证都发生在运行时。然而,使用编译语言,编译器能够进行相当多的“类型和执行流分析”。因此,如果它发现了永远无法执行的路径,它可以删除该路径中的代码(即死代码删除)。如果它发现一个永远不会成功的操作,它就会生成一个错误。
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