一尘不染

投射到不相关的接口时为什么要编译?

java

interface Printable {}
class BlackInk {}

public class Main {
    public static void main(String args[]) {
        Printable printable = null;
        BlackInk blackInk = new BlackInk();
        printable = (Printable)blackInk;
    }
}

如果前面的代码已编译并运行,则结果为ClassCastException printable = (Printable)blackInk;。但是,如果将Printable更改为一个类,则因为blackInk无法转换为Printable而无法编译。当Printable是接口时,为什么要编译?


阅读 299

收藏
2020-09-08

共1个答案

一尘不染

编译器不知道这是行不通的:您可能具有实现Printable的BlackInk子类。那演员就好了。

在编译器知道它不起作用的情况下,您会得到一个错误。

例如,如果您制作BlackInk final(这样就不能有子类),则会出现错误。

2020-09-08