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?
当编译器知道y instanceof C不能返回时true,它会产生编译错误。的编译时类型y是B,并且 class 与 classB没有关系C。因此, class 的实例B永远不能是 class 的实例C。
另一方面,x instanceof C可能会返回true,因为 的编译时类型x是A,并且C是 的子类A。
JLS 参考:
如果 RelationalExpression 到 ReferenceType 的强制转换会因为编译时错误而被拒绝,那么 instanceof 关系表达式同样会产生编译时错误。在这种情况下,instanceof 表达式的结果永远不会为真。