说我有一个叫做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。
还有其他方法可以复制内容类型未知的数组吗?
答案 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;
}
}