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

标签 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。

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

最佳答案

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]);

关于java - 如何在不知道数组内容的特定子类型的情况下复制数组的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55897866/

相关文章:

java - JDialog modal=true 与 ModalityType.APPLICATION_MODAL

java - Java 中的不可变对象(immutable对象)和访问数据

java - 根据条件将测试标记为忽略

xml - 将两个数组中的 XML 数据相加

python - 使用Python将多个目录中的文件复制到一个目录中

java - 八进制值赋值给 int

javascript - JS 在多个文件上运行。创建类还是使用 Webpack 和 Babel?

java - 使用数组列表并出现错误

r - 将 R data.frame 复制到 Excel 电子表格

javascript - 在纯 JavaScript 中使用数组内部的闭包