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 toSuperClass
,然后需要由每个子类实现。如果我这样做,两个数组的内容不会指向相同的对象吗?是的,内容本身引用原始数组中的相同对象,这会创建数组的副本,即,原始数组引用和副本数组引用是不同的。你知道吗你想在数组中创建每个对象的副本吗?是的,我想在数组中创建每个对象的副本。根据你的要求更新了答案。是的。我在超类中添加了一个抽象复制方法,然后在所有子类中重写。这导致我不必知道复制内容的具体类型。
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;
}
}