如何向下转换Java对象?

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

Tom*_*ine 9

如果要创建可能因非本地条件而异的类型实例,请使用抽象工厂(如"设计模式"一书中所述).

以它最简单的形式:

interface AnimalFactory {
    Animal createAnimal();
}

class DogFactory implements AnimalFactory {
    public Dog createAnimal() {
        return new Dog();
    }
}
Run Code Online (Sandbox Code Playgroud)

另请注意,引用的静态类型与对象的动态类型之间存在差异.即使你有一个Animal引用,如果原始对象是a Dog,它仍然表现得像Dog.