我试图理解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 中取出,而无需使用。 第一种 方法是 使用 遍历孩子 的方法 : 在以上代码段中,我们用来获取您的消息。然后,我们用于获取每个特定的子属