为什么 Java 上的 instanceof 会出现编译错误?

New*_*ing 5 java

class A {}
class B extends A {}
class C extends A {}
Run Code Online (Sandbox Code Playgroud)
A x = new B();
B y = new B();
Run Code Online (Sandbox Code Playgroud)
x instanceof C
y instanceof C
Run Code Online (Sandbox Code Playgroud)

为什么工作正常y instanceof C时会出现编译错误(不兼容的类型)x instanceof C

Era*_*ran 7

当编译器知道y instanceof C不能返回时true,它会产生编译错误。的编译时类型yB,并且 class 与 classB没有关系C。因此, class 的实例B永远不能是 class 的实例C

另一方面,x instanceof C可能会返回true,因为 的编译时类型xA,并且C是 的子类A

JLS 参考:

15.20.2. 类型比较运算符 instanceof

如果 RelationalExpression 到 ReferenceType 的强制转换会因为编译时错误而被拒绝,那么 instanceof 关系表达式同样会产生编译时错误。在这种情况下,instanceof 表达式的结果永远不会为真。