创建具有相同结果的通用数组的两种方法,但只有一种方法有效

时间:2018-06-10 14:21:28

标签: java arrays generics

我最近尝试创建一系列泛型,并发现它是不允许的:
Cannot create generic array of OptionSet<T>

我决定创建一个测试类,发现有一种不同的方法可以使用完全相同的结果:

public class Test {

    @SuppressWarnings("unchecked")
    public static final void main(String[] args) {
        A<String> a = null;
        A<String> b = null;

        A<?>[] array1 = array(a, b); // fine, only a warning
        A<?>[] array2 = new A<String>[] {a, b}; // Error: Cannot create a generic array of Test.A<String>
    }

    @SuppressWarnings("unchecked")
    private static final <T> A<T>[] array(A<T>... a) {
        return a; // fine, only a warning
    }

    private static final class A<T> {}

}

为什么?两种方法都有完全相同的结果,但由于某种原因,一个引发错误而另一个工作正常,尽管它会发出警告。

1 个答案:

答案 0 :(得分:0)

因为在通过返回类型private static final <T> A<T>[] array(A<T>... a)进行方法调用的情况下进行了转换,而A<?>[] array2 = new A<String>[] {a, b};不是直接创建实例的情况。

让它工作你需要像下面那样明确地进行投射:

A<?>[] array2 = (A<String>[])(new A<?>[] { a, b });

发生的是元素A<String>但不是数组本身;在你明确地投射它之前,它仍然是通用的A<?>