如何在不知道数组内容特定子类型的情况下复制数组内容?

时间:2019-04-29 06:13:32

标签: java arrays copy

说我有一个叫做SuperClass的抽象类,还有许多扩展它的类。我有一个SuperClass []类型的数组。我想用一个具有相同子类和相同属性的新对象组成一个数组。

我试图通过创建实例化新对象并用它们填充新数组来做到这一点。但是,这无法按以下说明进行操作。

SuperClass[] newArray = new SuperClass[arr.length];
for (int i = 0; i <= arr.length; i++) {
    SuperClass toBeCopied = arr[i];
    newArray[i] = new SuperClass(toBeCopied.attribute1, toBeCopied.attribute2...);

这不起作用,因为SuperClass是抽象的,因此无法实例化。

我也查看了.clone(),但是SuperClass没有扩展Cloneable。

还有其他方法可以复制内容类型未知的数组吗?

2 个答案:

答案 0 :(得分:1)

Arrays中有一组静态方法可以复制数组。例如:<T> T[] copyOf(T[] original, int newLength)。用法:

abstract class SuperClass {  }

class SubClass extends SuperClass {  }

// copy
SuperClass[] subClasses = new SubClass[10];
SuperClass[] subClassesCopy = Arrays.copyOf(subClasses, 10);

-更新-

由于要在数组中复制每个对象,因此可以在SuperClass中定义一个抽象方法,并使子类对其进行扩展。

  abstract class SuperClass {

    public abstract SuperClass deepCopy();
  }

  class SubClass extends SuperClass {

    private String value;

    public SubClass(String value) {
      this.value = value;
    }

    @Override
    public SubClass deepCopy() {
      return new SubClass(this.value);
    }
  }

然后在您的代码中调用deepCopy

    SuperClass[] subClasses = new SubClass[] { new SubClass("1"), new SubClass("2") };

    SuperClass[] subClassesCopy = Arrays.stream(subClasses)
        .map(orig -> orig.deepCopy())
        .collect(Collectors.toList())
        .toArray(new SuperClass[subClasses.length]);

答案 1 :(得分:0)

您可以使用反射来实现

SuperClass[] newArray = new SuperClass[arr.length];
for (int i = 0; i <= arr.length; i++) {
  SuperClass toBeCopied = arr[i];
  newArray[i] = (SuperClass) Class.forName(toBeCopied.getClass().getName())
      .getConstructor(String.class, String.class)
      .newInstance(new Object[] { toBeCopied.getAttribute1(),toBeCopied.getAttribute2() });
}

我在这里考虑,您的构造函数带有两个String类型的参数。如果您使用其他类型的参数,请在.getConstructor(String.class, String.class)处更改类型。

子类型(类)

public class SubType1 extends SuperClass{
  public SubType1(String attribute1, String attribute2) {
    super(attribute1, attribute2);
  }
}

public class SubType2 extends SuperClass{
  public SubType2(String attribute1, String attribute2) {
    super(attribute1, attribute2);
  }
}

超一流

public abstract class SuperClass {
private String attribute1;
private String attribute2;

public SuperClass(String attribute1, String attribute2) {
    // TODO Auto-generated constructor stub
    this.attribute1 = attribute1;
    this.attribute2 = attribute2;
}

public String getAttribute1() {
    return attribute1;
}

public void setAttribute1(String attribute1) {
    this.attribute1 = attribute1;
}

public String getAttribute2() {
    return attribute2;
}

public void setAttribute2(String attribute2) {
    this.attribute2 = attribute2;
}
}