Java:将类转换为不相关的接口

enp*_*yne 8 java casting runtime compilation interface

显然,这会导致编译错误,因为Chair与Cat无关:

class Chair {}
class Cat {}

class Test {
   public static void main(String[] args) {
       Chair chair = new Char(); Cat cat = new Cat();
       chair = (Chair)cat; //compile error
   }
}
Run Code Online (Sandbox Code Playgroud)

那么为什么我在运行时只将Cat引用转换为不相关的接口Furniture时才会出现异常,而编译器显然可以告诉Cat不实现Furniture?

interface Furniture {}

class Test {
   public static void main(String[] args) {
       Furniture f; Cat cat = new Cat();
       f = (Furniture)cat; //runtime error
   }
}
Run Code Online (Sandbox Code Playgroud)

Sot*_*lis 14

这个编译的原因

interface Furniture {}

class Test {
   public static void main(String[] args) {
       Furniture f; Cat cat = new Cat();
       f = (Furniture)cat; //runtime error
   }
}
Run Code Online (Sandbox Code Playgroud)

是你很可能有

public class CatFurniture extends Cat implements Furniture {}
Run Code Online (Sandbox Code Playgroud)

如果您创建了一个CatFurniture实例,则可以将其分配给Cat cat该实例并将该实例转换为该实例Furniture.换句话说,某些Cat子类型可能实现了Furniture接口.

在你的第一个例子中

class Test {
    public static void main(String[] args) {
        Chair chair = new Char(); Cat cat = new Cat();
        chair = (Chair)cat; //compile error
    }
}
Run Code Online (Sandbox Code Playgroud)

除非自身延伸,否则某些Cat子类型不可能延伸.ChairCatChair

  • 值得注意的是,如果`Cat`被声明为`final`,编译器确实会抱怨(它会知道`Cat`的子类不能实现`Furniture`,因为可能没有`Cat`的子类). (5认同)