为什么编译器允许我将一个实现类转换为另一个实现类?

nis*_*527 3 java inheritance downcast

因此,我正忙于向下转换,试图找到有效的方法和无效的方法。我有三个类:基类Animal和两个派生类DogCat

private class Animal {
}

private class Dog extends Animal {
}

private class Cat extends Animal {
}
Run Code Online (Sandbox Code Playgroud)

出于明显的原因,编译器不允许以下代码:

Dog dog = s.new Dog();
Cat cat = (Cat) dog;
Run Code Online (Sandbox Code Playgroud)

这是因为我将一个派生类转换为另一派生类,这是不可能的。但是,如果我创建Animal一个接口类型和Cat一个接口类型,那么编译器会突然接受它,即使没有可能,也不会出现任何问题。

private interface Animal {

}

private class Dog implements Animal {

}

private interface Cat extends Animal {

}
Run Code Online (Sandbox Code Playgroud)

一旦运行与以前相同的代码,就会像预期的那样给我一个错误。

Jon*_*len 5

之所以允许这样做,是因为另一个类很可能存在,如下所示:

class CatDog extends Dog implements Cat {
}
Run Code Online (Sandbox Code Playgroud)

因为此类可能存在,所以将任何(非final)类型的对象强制转换为任何接口类型是合法的。