知道继承类型
know type of inheritance
如果我有继承class喜欢
class Animals{}
class Dog extends Animals{}
class Cat extends Animals{}
我怎么知道 class 是哪种类型? (我的意思是,如果想知道下面的对象是狗还是猫)
我有 ArrayList
个 Animals
,其中包含 Cat
和 Dog
。我将此信息保存在一个文件中,以供以后加载信息。但问题是当我想加载我需要知道 class 是哪种类型的信息时,用于调用 dog 或 cat 构造函数(cat 和 dogs 具有不同的构造函数参数)。
所以我的解决方案之一是存储对象类型,以便在我加载信息时调用正确的构造函数。对此有更好的解决方案吗?
例如使用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!");
}
我想你想重新实现 java 的序列化。
而不是
- 你应该让 class 动物实现可序列化标记接口
- 简单地写入数组然后从文件中读取 like described here
既然是保存信息,那还可以把类型打印出来。
例如,您可以使用如下内容:
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]
然后,您可以根据必填字段轻松填写重建狗和猫所需的信息。
也就是说,您可以将其写到文件中。正如您在问题中所建议的那样,这与您已经在执行此操作的方式类似。
之前已经做过,所以不推荐创建自己的方法。
另一种方法是为每个 class(想想 serialVersionUID
)设置一个唯一标识符。
这只是Serialization的一种形式。有了基本的 read
和 write
方法就可以在 class 到 class 的基础上处理正确的数据解析。
最好为 Animals
class 实现 Serializable
,然后将您不想写入和读取的字段发送到 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;
如果我有继承class喜欢
class Animals{}
class Dog extends Animals{}
class Cat extends Animals{}
我怎么知道 class 是哪种类型? (我的意思是,如果想知道下面的对象是狗还是猫)
我有 ArrayList
个 Animals
,其中包含 Cat
和 Dog
。我将此信息保存在一个文件中,以供以后加载信息。但问题是当我想加载我需要知道 class 是哪种类型的信息时,用于调用 dog 或 cat 构造函数(cat 和 dogs 具有不同的构造函数参数)。
所以我的解决方案之一是存储对象类型,以便在我加载信息时调用正确的构造函数。对此有更好的解决方案吗?
例如使用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!");
}
我想你想重新实现 java 的序列化。 而不是
- 你应该让 class 动物实现可序列化标记接口
- 简单地写入数组然后从文件中读取 like described here
既然是保存信息,那还可以把类型打印出来。
例如,您可以使用如下内容:
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]
然后,您可以根据必填字段轻松填写重建狗和猫所需的信息。
也就是说,您可以将其写到文件中。正如您在问题中所建议的那样,这与您已经在执行此操作的方式类似。
之前已经做过,所以不推荐创建自己的方法。
另一种方法是为每个 class(想想 serialVersionUID
)设置一个唯一标识符。
这只是Serialization的一种形式。有了基本的 read
和 write
方法就可以在 class 到 class 的基础上处理正确的数据解析。
最好为 Animals
class 实现 Serializable
,然后将您不想写入和读取的字段发送到 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;