如果我有像
这样的继承类class Animals{}
class Dog extends Animals{}
class Cat extends Animals{}
我怎么知道哪种类型的课程? (我的意思是,如果想要知道下面的一个物体是狗还是猫)
我有一个ArrayList
Animals
,其中包含Cat
和Dog
s。我将此信息保存在一个文件中,以便以后加载信息。但问题是当我想加载我需要知道哪种类型的信息时,为了调用dog或cat构造函数(cat和dog有不同的构造函数参数)。
所以我的一个解决方案是存储对象的类型,以便在我加载信息时调用正确的构造函数。对此有更好的解决方案吗?
答案 0 :(得分:2)
我认为你想重新实现java的序列化。 而不是那个
答案 1 :(得分:1)
由于您要保存信息,因此您还可以打印出类型。
例如,您可以使用以下内容:
for (final Animals animal : myAnimalList){
output.print(animal.getClass().getSimpleName());
output.println(animal.getData());
}
对于Dog
的实例,这将打印出"Dog"
,对于Cat
的实例,它将打印出"Cat"
。随后是getData()
信息。这假设getData()
将包含用于打印信息的适当数据。
然后你可以实现类似的目标:
Dog[name=Ruff, age=17, favoriteToy=Ball]
Cat[name=Tom, age=102, hates=Everyone]
然后,您可以根据所需字段轻松填写重建狗和猫所需的信息。
话虽这么说,你可以把它写到文件中。正如您的问题所示,这与您已经这样做的方式类似。
之前已经完成了这项工作,所以创建自己的方法,不建议这样做。
另一种方法是为每个类设置一个唯一的标识符(想想serialVersionUID
)。
这只是Serialization的一种形式。然后,基本的read
和write
方法可以处理在类到类的基础上解析正确的数据。
为Serializable
课程实施Animals
会更好,然后发送您不想写入并阅读transient
的字段。
然后,您可以使用这些签名填写所有适当的方法:
private void writeObject(java.io.ObjectOutputStream out) throws IOException
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException;
private void readObjectNoData() throws ObjectStreamException;
答案 2 :(得分:-1)
使用getClass()
例如:
Animal dog = new Dog();
if (dog.getClass().equals(Dog.class)) {
System.out.printf("Its dog!");
}
或者正如Beko指出的那样
Animal dog = new Dog();
if (dog instanceof Dog) {
System.out.printf("Its dog!");
}