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

时间:2014-11-11 17:16:41

标签: 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;
    }
}

现在,我想介绍一个复制构造函数,它复制一个未知类型的泛型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<?>对象的副本,其类型未知?

1 个答案:

答案 0 :(得分:5)

传入的实例属于A<E>类型,在这种情况下您可以复制它,或者它不是,在这种情况下,您无法将其复制到类型{的实例中{1}}。因此,允许A<E>作为输入类型没有意义:您应该将其限制为A<?>

实际上您可以将其限制为A<E>,因为这些仍然与A<? extends E>兼容。

尝试将其他任何内容复制到此处并不重要,只有E构造函数可以采用HashSet类型的复制参数。