最终类的编译器错误实例

Tra*_*ace 5 java

以下代码编译正常:

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)

如果我们创建Batfinal,代码不会编译:

final class Bat { } 
Run Code Online (Sandbox Code Playgroud)

如果最终的类实现Flyer,它编译好:

final class Bat implements Flyer { } 
Run Code Online (Sandbox Code Playgroud)

有人在乎解释这背后的逻辑吗?

Tun*_*aki 6

当你上课时Bat final,你说这个班级不能被分类.由于Bat没有实现接口Flyer,编译器能够确定b instanceof Flyer永远不会出现true并引发错误.

这在JLS 第15.20.2节中规定:

如果RelationalExpressionReferenceType的强制转换(第15.16节)将作为编译时错误被拒绝,则instanceof关系表达式同样会产生编译时错误.在这种情况下,instanceof表达式的结果永远不会成立.

另外,关于强制转换表达式的第15.16节:

如果根据转换转换规则(第5.5节),操作数的编译时类型永远不会转换为强制转换运算符指定的类型,那么这是一个编译时错误.

在这种情况下,Bat永远不能强制转换为Flyer:它不实现它并final确保不存在实现它的子类.


正如您所发现的,修复方法是:

  • 制作Bat工具Flyer:在这种情况下,instanceof操作员将始终返回true.
  • 取下final标识,这意味着有可能是子类Bat实现Flyer.