在 java 中使用超类对象创建未知子类的新实例

Make a new instance of an unknown subclass using superclass object in java

这里我有一个抽象的class人和多个子classes:

public abstract class Person {

    public String name;

    public Person(String name) {
        this.name = name;
    }
}

public class ComputerScientist extends Person {

    public String job;

    public ComputerScientist(String name, String job) {
        super(name);
        this.job = job;
    }
}

public class SoftwareEngineer extends Person {

    public String job;

    public SoftwareEngineer(String name, String job) {
        super(name);
        this.job = null;
    }
}

这就是我运行:

public static void main(String[] args) {
    List<Person> people = new ArrayList<Person>();
    person.add(new ComputerScientist("ben", "job"));
    person.add(new SoftwareEngineer("larry", "job"));
    Random r = new Random();

    Person person = people.get(r.nextInt(people.size() - 1);
}

人变得和列表中的人一样,我如何得到它作为一个人的克隆。克隆和新实例不起作用。

我可能可以使用复制方法来完成它(需要我重写大量代码)但是有没有(可能更有效的)方法可以不用它?

使用具有 Cloneable 接口的工具使您的 class 可克隆。并在对象 user .clone() 方法中克隆 person class object

我不是 clone() 的粉丝 - 另请参阅 Clone() vs Copy constructor- which is recommended in java

所以,改用复制构造函数或复制方法,接受一个人,然后传递相关信息

您可以创建一个方法来创建 Person 的新对象(根据子 class)和另一个方法来复制新对象中的状态。请参阅下面的方法了解相同的基本实现。

public abstract class Person{
  ...//your states and methods
  protected void copy(Person copiedPerson){
        copiedPerson.name = this.name;
  }

  public abstract Person getCopyPerson();
}

public class SoftwareEngineer extends Person{

     ....//your states and methods
    @override
     protected void copy( Person copiedPerson ){
          super(copiedPerson);
          copiedPerson.job = this.job;
     }

    @override
    public Person getCopyPerson(){
       Person copyPerson = new SoftwareEngineer();
       copy(copyPerson);
       return copyPerson;
    }

}

现在,无论何时获取 Person 的对象,只需对其调用 getCopyPerson() 即可获取副本对象。