我正在寻求实现一个包含两个字段的泛型类:
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<?>
对象的副本,其类型未知?
答案 0 :(得分:5)
传入的实例属于A<E>
类型,在这种情况下您可以复制它,或者它不是,在这种情况下,您无法将其复制到类型{的实例中{1}}。因此,允许A<E>
作为输入类型没有意义:您应该将其限制为A<?>
。
实际上您可以将其限制为A<E>
,因为这些仍然与A<? extends E>
兼容。
尝试将其他任何内容复制到此处并不重要,只有E
构造函数可以采用HashSet
类型的复制参数。