当前位置: 首页 > 面试题库 >

如何向下转换Java对象?

淳于玺
2023-03-14
问题内容

我试图理解Java的多态性,但是我有一个关于向下转换对象的问题。假设在此示例中,我有两个子类Dog和Cat,它们从超类Animal继承

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

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


问题答案:

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

以最简单的形式:

interface AnimalFactory {
    Animal createAnimal();
}

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

还要注意,引用的静态类型与对象的html" target="_blank">动态类型之间存在差异。即使您有Animal引用,但如果原始对象是a Dog,它的行为仍然类似于a Dog



 类似资料:
  • 问题内容: 我想将以下JSON字符串转换为Java对象: 我的目标是轻松访问它,例如: 我听说过Jackson,但是由于涉及“ mymusic”列表,我不知道如何使用它来适应我拥有的json字符串,因为它不仅仅是键值对。如果杰克逊不是最好的选择,我该如何用杰克逊完成? 问题答案: 为此,无需与GSON一起使用;杰克逊可以做普通的地图/列表: 或更方便的JSON树: 顺便说一句,没有理由为什么您不能

  • 我听说过Jackson,但我不确定如何使用它来适应我所拥有的json字符串,因为它不仅仅是键值对,因为涉及到“MyMusic”列表。如果杰克逊不是最好的,我怎么能和杰克逊一起完成这件事呢?或者有什么更简单的方法可以让我完成这件事呢?

  • 问题内容: 我将JComboBox与自定义类对象一起使用,并且equals方法被覆盖,并且非常深入地集成到代码中。 问题是,如果在JComboBox下拉列表中两个对象相等,那么如果选择了一个,则全部选中,并且get selected索引返回-1。 有没有一种方法可以将a强制转换为a ?我试过了 和 其中是的父项,是的扩展项,但它们都不编译。 我需要的只是JComboBox,不要使用重写的equal

  • 问题内容: 我有一个ArrayList,随着更多用户加入聊天室而变得越来越大。主JFrame有一个列表框,显示所有当前连接的用户。但是当我尝试将arraylist传递到jframe列表中时,出现以下错误: “ JList类型的方法setListData(Object [])不适用于参数(ArrayList)” 谢谢你的时间。 问题答案: 您可以简单地使用 或者,您也可以编写自己的,例如,由来支持…

  • 我有一个像下面这样的JSON,我想通过解析它来生成相应类的Java对象。问题是我不希望该对象中maxtime的值设置为{{Instant.MAX.toString ()}}, 但它应该是它的翻译值,这意味着它应该是100000000-12-31T23:59:59.9999999Z。有没有任何标准库来实现这个类似的要求,或者我必须为此编写一个定制的代码? 在最坏的情况下,我已经准备好用其他类型的文件

  • 问题内容: 使用Firebase库以添加到表单中的表单将数据发送到服务器 例: 使用Firebase方法接收数据时,以这种形式获取String 如何将其转换为Message Object ..... ???? 问题答案: 还有两种方法可以将数据从Firebase 中取出,而无需使用。 第一种 方法是 使用 遍历孩子 的方法 : 在以上代码段中,我们用来获取您的消息。然后,我们用于获取每个特定的子属