nba*_*lle 19 java oop inheritance downcast
我试图理解Java的多态性,我有一个关于向下转换对象的问题.让我们说这个例子我有两个继承自超类Animal的子类Dog和Cat
根据我的理解,向下转换对象的唯一方法是,如果此Object已经是好的类型,如下所示:
Animal a = new Dog();
Dog d = (Dog) a;
Run Code Online (Sandbox Code Playgroud)
这样可行吗?
但是如果我想在不知道它会是什么的情况下创造一个普通的动物,然后在我知道的时候施放它,我该怎么办呢?
Animal a = new Animal();
Dog d = (Dog) a;
Run Code Online (Sandbox Code Playgroud)
这会在运行时抛出ClassCastException吗?
我发现这样做的唯一方法是创建一个新的Dog构造函数,从常规动物创建一个狗:
Animal a = new Animal();
Dog d = new Dog(a);
Run Code Online (Sandbox Code Playgroud)
同
public Class Dog extends Animal{
public Dog(Animal a){
super(a);
}
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,我该怎么做呢?
非常感谢!nbarraille
如果要创建可能因非本地条件而异的类型实例,请使用抽象工厂(如"设计模式"一书中所述).
以它最简单的形式:
interface AnimalFactory {
Animal createAnimal();
}
class DogFactory implements AnimalFactory {
public Dog createAnimal() {
return new Dog();
}
}
Run Code Online (Sandbox Code Playgroud)
另请注意,引用的静态类型与对象的动态类型之间存在差异.即使你有一个Animal
引用,如果原始对象是a Dog
,它仍然表现得像Dog
.