我正在寻求实现一个具有两个字段的通用类:
class A<E>{
private final E[] values;
private final int size;
//default constructor
public A(){
values = (E[]) new Object[0];
size = 0;
}
}
现在,我想介绍一个复制构造函数,它复制一个未知类型的泛型 A 对象。像这样:
class A<E>{
private final E[] values;
private final int size;
//default constructor
public A(){
values = (E[]) new Object[0];
size = 0;
}
//the copy constructor
public A(A<?> a){
//Code here
}
}
基本思想是使用通配符捕获辅助函数作为
private <T> T[] copyHelper(A<T> originalA){
T[] originalValue = originalA.value;
T[] copy = Arrays.copyOf(originalValue, 0);
return copy;
}
然后在拷贝构造函数中做
public A(A<?> a){
value = (A[]) copyHelper(a);
size = a.size;
}
这样做有用吗?不是从 copyHelper()
转换返回值至 E[]
多余?
我还能如何获得传递的副本 A<?>
对象,其类型未知?
最佳答案
传入的实例类型为 A<E>
,在这种情况下你可以复制它,或者它不是,在这种情况下你不能将它复制到 A<E>
类型的实例中。 .因此没有必要允许 A<?>
作为输入的类型:您应该将其限制为 A<E>
.
实际上您可以将其限制为 A<? extends E>
,因为它们仍然与 E
兼容.
尝试将任何其他内容复制到这里是没有意义的,就像 HashSet
一样构造函数可以采用 int[]
类型的复制参数.
关于java - 如何通过 Java 中的通用通配符捕获创建数组的克隆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26870577/