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

标签 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<?>对象,其类型未知?

最佳答案

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

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

尝试将任何其他内容复制到这里是没有意义的,就像 HashSet 一样构造函数可以采用 int[] 类型的复制参数.

关于java - 如何通过 Java 中的通用通配符捕获创建数组的克隆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26870577/

相关文章:

java - 通用参数上的非空注释如何传播到其使用?

java - Java 中的模块化数学(环绕的数字线)

java - Java 中泛型的类型安全

common-lisp - Common Lisp 中的路径名,包含通配符的文件名

windows - 在批处理文件中使用通配符

excel - 使用通配符打开 Excel 工作簿

java - Spring 启用独立的 Java 库

java - 如何将 XML 解码到此类?

scala - 引用由抽象类型成员遮蔽的泛型类型参数

java - 无法从 ArrayList<Object> 转换为 ArrayList<MyObject>