以下代码编译正常:
interface Flyer{ }
class Bat { }
public class App {
public static void main(String[] args) {
Bat b = new Bat();
if(b instanceof Flyer) System.out.println("b is a Bird");
}
}
Run Code Online (Sandbox Code Playgroud)
如果我们创建Bat类final,代码不会编译:
final class Bat { }
Run Code Online (Sandbox Code Playgroud)
如果最终的类实现Flyer,它编译好:
final class Bat implements Flyer { }
Run Code Online (Sandbox Code Playgroud)
有人在乎解释这背后的逻辑吗?
当你上课时Bat final,你说这个班级不能被分类.由于Bat没有实现接口Flyer,编译器能够确定b instanceof Flyer永远不会出现true并引发错误.
这在JLS 第15.20.2节中规定:
如果RelationalExpression与ReferenceType的强制转换(第15.16节)将作为编译时错误被拒绝,则
instanceof关系表达式同样会产生编译时错误.在这种情况下,instanceof表达式的结果永远不会成立.
另外,关于强制转换表达式的第15.16节:
如果根据转换转换规则(第5.5节),操作数的编译时类型永远不会转换为强制转换运算符指定的类型,那么这是一个编译时错误.
在这种情况下,Bat永远不能强制转换为Flyer:它不实现它并final确保不存在实现它的子类.
正如您所发现的,修复方法是:
Bat工具Flyer:在这种情况下,instanceof操作员将始终返回true.final标识,这意味着有可能是子类Bat实现Flyer.| 归档时间: |
|
| 查看次数: |
339 次 |
| 最近记录: |