public class A<T> {
B[] bs = new B[5];
private class B {
}
}
我收到一个编译时错误,说new B[5]
是通用数组创建。我没想到这是因为:
考虑到这些原因,为什么new B[5]
仍然被认为是通用阵列创建?
因为创建B
实例(因为它是内部类)的唯一方法是使用参数化A
的实例。简单的修复,改变
private class B
至
private static class B
由于B
是A
的非静态内部类,在A
的范围内,非限定名称B
意味着A<T>.B
,这是参数化类型(即使B
看起来不参数化)。 (这是有道理的,因为非静态内部类包含对外部类实例的引用;因为这个对外部类实例的引用是参数化的,所以内部类实例也必须参数化,因此内部类实例“继承”外部类类型参数。)您不能在数组创建表达式中创建参数化类型的数组,因此您不能执行new B[5]
(因为它隐含地表示new A<T>.B[5]
)。
您可以改为创建原始类型的数组。但请记住,B
本身是参数化类型而不是原始类型。要获取原始类型,必须使用原始外部类类型明确限定它:
B[] bs = new A.B[5];
或者您可以创建通配符参数化类型的数组:
B[] bs = (B[])new A<?>.B[5];
在这两种情况下,您将获得一个未经检查的警告,如果您想获得类型为“参数化类型数组”的变量(如B[]
),则在Java中始终是不可避免的警告。