nis*_*527 3 java inheritance downcast
因此,我正忙于向下转换,试图找到有效的方法和无效的方法。我有三个类:基类Animal和两个派生类Dog和Cat:
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)
一旦运行与以前相同的代码,就会像预期的那样给我一个错误。
之所以允许这样做,是因为另一个类很可能存在,如下所示:
class CatDog extends Dog implements Cat {
}
Run Code Online (Sandbox Code Playgroud)
因为此类可能存在,所以将任何(非final)类型的对象强制转换为任何接口类型是合法的。