知道继承类型

know type of inheritance

如果我有继承class喜欢

class Animals{}
class Dog extends Animals{}
class Cat extends Animals{}

我怎么知道 class 是哪种类型? (我的意思是,如果想知道下面的对象是狗还是猫)

我有 ArrayListAnimals,其中包含 CatDog。我将此信息保存在一个文件中,以供以后加载信息。但问题是当我想加载我需要知道 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 的序列化。 而不是

  1. 你应该让 class 动物实现可序列化标记接口
  2. 简单地写入数组然后从文件中读取 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的一种形式。有了基本的 readwrite 方法就可以在 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;