所以我一直在搞向下转型,试图找出什么有效,什么无效。我有三个类:基类 Animal
和两个派生类 Dog
和Cat
:
private class Animal {
}
private class Dog extends Animal {
}
private class Cat extends Animal {
}
出于明显的原因,编译器不允许使用以下代码:
Dog dog = s.new Dog();
Cat cat = (Cat) dog;
这是因为我将一个派生类转换为另一个派生类,这是不可能的。但是,如果我做 Animal
接口(interface)类型和Cat
一个接口(interface)类型,然后编译器突然接受它并且没有说任何问题,即使这是不可能的。
private interface Animal {
}
private class Dog implements Animal {
}
private interface Cat extends Animal {
}
当我运行与以前相同的代码时,正如预期的那样,它会给我一个错误。
最佳答案
允许这样做的原因是因为另一个类完全有可能存在,如下所示:
class CatDog extends Dog implements Cat {
}
因为这样的类可能存在,所以将任何(非final
)类型的对象强制转换为任何接口(interface)类型都是合法的。
关于java - 为什么编译器允许我将一个实现类转换为另一个实现类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57518059/