Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在不知道数组内容的特定子类型的情况下复制数组内容?_Java_Arrays_Copy - Fatal编程技术网

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

Java 如何在不知道数组内容的特定子类型的情况下复制数组内容?,java,arrays,copy,Java,Arrays,Copy,假设我有一个名为超类的抽象类和许多扩展它的类。我有一个超类[]类型的数组。我想用相同子类和相同属性的新对象创建一个数组 我试图通过创建实例化新对象并用它们填充新数组来实现这一点。但是,如下所示,这不起作用 SuperClass[] newArray = new SuperClass[arr.length]; for (int i = 0; i <= arr.length; i++) { SuperClass toBeCopied = arr[i]; newArray[i]

假设我有一个名为超类的抽象类和许多扩展它的类。我有一个超类[]类型的数组。我想用相同子类和相同属性的新对象创建一个数组

我试图通过创建实例化新对象并用它们填充新数组来实现这一点。但是,如下所示,这不起作用

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[]newArray=新的超类[arr.length];

对于(int i=0;i在
数组中有一组可以复制数组的静态方法。例如:
T[]copyOf(T[]original,int newLength)
。用法:

抽象类超类{}
类子类扩展超类{}
//抄袭
超类[]子类=新的子类[10];
超类[]子类透视=Arrays.copyOf(子类,10);
--更新--

由于需要数组中每个对象的副本,因此可以在
超类中定义一个抽象方法,并让子类对其进行扩展

抽象类超类{
公共抽象超类deepCopy();
}
类子类扩展了超类{
私有字符串值;
公共子类(字符串值){
这个值=值;
}
@凌驾
公共子类deepCopy(){
返回新的子类(this.value);
}
}
然后在代码中调用
deepCopy

超类[]子类=新子类[]{新子类(“1”),新子类(“2”)};
超类[]子类透视=数组.stream(子类)
.map(源->源.deepCopy())
.collect(收集器.toList())
.toArray(新的超类[子类.length]);

您可以使用反射来执行此操作

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() });
}
超级级

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;
}
}

你看过反射了吗?你看过了吗?当然,你可以尝试通过instanceof根据每个对象的子类型进行区分,并复制具体对象。重构这种不方便的行为将是使用抽象复制或克隆方法扩展超类。@Smutje问题是子类太多,这会ld使我的代码非常混乱,难以维护。添加
公共抽象超类副本()
method to
SuperClass
,然后需要由每个子类实现。如果我这样做,两个数组的内容不会指向相同的对象吗?是的,内容本身引用原始数组中的相同对象,这会创建数组的副本,即,原始数组引用和副本数组引用是不同的。你知道吗你想在数组中创建每个对象的副本吗?是的,我想在数组中创建每个对象的副本。根据你的要求更新了答案。是的。我在超类中添加了一个抽象复制方法,然后在所有子类中重写。这导致我不必知道复制内容的具体类型。
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;
}
}