jig*_*mnc 2 java generics wildcard
我正在寻求实现一个包含两个字段的泛型类:
class A<E>{
private final E[] values;
private final int size;
//default constructor
public A(){
values = (E[]) new Object[0];
size = 0;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我想介绍一个复制构造函数,它复制一个未知类型的泛型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
}
}
Run Code Online (Sandbox Code Playgroud)
基本思想是使用通配符捕获帮助函数
private <T> T[] copyHelper(A<T> originalA){
T[] originalValue = originalA.value;
T[] copy = Arrays.copyOf(originalValue, 0);
return copy;
}
Run Code Online (Sandbox Code Playgroud)
然后在复制构造函数中做
public A(A<?> a){
value = (A[]) copyHelper(a);
size = a.size;
}
Run Code Online (Sandbox Code Playgroud)
这是否符合目的?是不是将返回值转换copyHelper()为E[]多余的?我怎样才能获得传递A<?>对象的副本,其类型未知?
传入的实例是类型A<E>,在这种情况下你可以复制它,或者它不是,在这种情况下你不能将它复制到类型的实例A<E>.因此,允许A<?>作为输入的类型是没有意义的:您应该将其限制为A<E>.
实际上你可能会限制它A<? extends E>,因为它们仍然兼容E.
尝试将其他任何内容复制到此处是没有意义的,只不过HashSet构造函数可以采用类型的复制参数int[].