我最近尝试创建一系列泛型,并发现它是不允许的:
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> {}
}
为什么?两种方法都有完全相同的结果,但由于某种原因,一个引发错误而另一个工作正常,尽管它会发出警告。
答案 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<?>
。