我正在寻求实现一个具有两个字段的通用类:
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[]
的复制参数外。