gpt4 book ai didi

java - 如何向下转换 Java 对象?

转载 作者:IT老高 更新时间:2023-10-28 21:02:08 25 4
gpt4 key购买 nike

我正在尝试理解 Java 的多态性,并且我有一个关于向下转换对象的问题。假设对于这个例子,我有两个继承自父类(super class) Animal 的子类 Dog 和 Cat

据我了解,向下转换对象的唯一方法是该对象已经是好的类型,如下所示:

Animal a = new Dog();
Dog d = (Dog) a;

这行得通吗?

但是如果我想在不知道它会是什么的情况下创建一个普通的动物,然后在我知道的时候施放它,我该怎么做呢?

Animal a = new Animal();
Dog d = (Dog) a;

这会在运行时抛出 ClassCastException 对吗?

我发现这样做的唯一方法是创建一个新的 Dog 构造函数,该构造函数从普通动物创建狗:

Animal a = new Animal();
Dog d = new Dog(a);

public Class Dog extends Animal{
public Dog(Animal a){
super(a);
}
}

所以我的问题是,我应该怎么做?

  • 我这样做是不是最好的方式?
  • 难道我根本不应该这样做吗?如果我必须这样做,这意味着我的程序没有精心构思?
  • 我错过了更好的方法吗?

非常感谢!nbarraille

最佳答案

如果您想创建一个可能因非本地条件而异的类型的实例,请使用 Abstract Factory (如《设计模式》一书中所述)。

最简单的形式:

interface AnimalFactory {
Animal createAnimal();
}

class DogFactory implements AnimalFactory {
public Dog createAnimal() {
return new Dog();
}
}

请注意,引用的静态类型和对象的动态类型之间存在差异。即使你有一个 Animal 引用,如果原始对象是一个 Dog,它的行为仍然像一个 Dog

关于java - 如何向下转换 Java 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4033118/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com