我正在寻求实现一个具有两个字段的通用类:

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[]的复制参数外。

10-07 13:35