如何通过Java中的通用通配符捕获创建数组的克隆?

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<?>对象的副本,其类型未知?

chi*_*ity 5

传入的实例是类型A<E>,在这种情况下你可以复制它,或者它不是,在这种情况下你不能将它复制到类型的实例A<E>.因此,允许A<?>作为输入的类型是没有意义的:您应该将其限制为A<E>.

实际上你可能会限制它A<? extends E>,因为它们仍然兼容E.

尝试将其他任何内容复制到此处是没有意义的,只不过HashSet构造函数可以采用类型的复制参数int[].