为何Java编译器对两种相似instanceof判断仅一处报不可转换类型错误
Java两种instanceof判断编译结果差异原因
这个是Java语言规范明确规定的编译校验逻辑,不属于编译器bug,两种场景的差异根源如下:
- 报错场景:
hasInterface instanceof IntegerInteger是Java内置的final类,无法被继承,且该类没有实现你定义的HasInterface接口。- 编译期可以100%判定:所有实现了
HasInterface接口的类实例,永远不可能同时是Integer的实例,该判断恒为假,因此编译器直接抛出不可转换类型错误。
- 无报错场景:
hasInterface instanceof A- 你定义的
A是普通非final类,虽然当前A没有实现HasInterface,但后续可以存在A的子类同时实现HasInterface接口,例如如下代码是完全合法的:
// 合法的子类实现 class SubA extends A implements HasInterface {}- 运行时
hasInterface指向的对象完全可能是SubA的实例,此时该instanceof判断结果为真,编译器无法在编译期直接否定该判断的合理性,因此不会触发报错。
- 你定义的
验证补充
如果你将类A的定义修改为final类:public static final class A,此时第二个instanceof判断也会触发完全相同的不可转换类型错误,你可以自行测试验证。
内容的提问来源于stack exchange,提问作者user43968
相关产品推荐
相关产品推荐

