为什么在外部参数化类中创建一个数组,其中组件类型是一个被认为是“通用数组创建”的内部类?

问题描述 投票:0回答:2
public class A<T> {
    B[] bs = new B[5];

    private class B {

    }
}

我收到一个编译时错误,说new B[5]是通用数组创建。我没想到这是因为:

  1. B本身不是参数化的。
  2. B不是A的类型参数。

考虑到这些原因,为什么new B[5]仍然被认为是通用阵列创建?

java arrays generics
2个回答
1
投票

因为创建B实例(因为它是内部类)的唯一方法是使用参数化A的实例。简单的修复,改变

private class B

private static class B

1
投票

由于BA的非静态内部类,在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中始终是不可避免的警告。

© www.soinside.com 2019 - 2024. All rights reserved.