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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么在外部参数化类中创建一个数组,其中组件类型是一个被认为是“通用数组创建”的内部类?相关的知识,希望对你有一定的参考价值。

public class A<T> {
    B[] bs = new B[5];

    private class B {

    }
}

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

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

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

答案

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

private class B

private static class B
另一答案

由于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中始终是不可避免的警告。

以上是关于为什么在外部参数化类中创建一个数组,其中组件类型是一个被认为是“通用数组创建”的内部类?的主要内容,如果未能解决你的问题,请参考以下文章

Android Oreo (API 26) - 在外部存储中创建目录

javascript 在外部文件中创建jquery函数

docker中创建MySQL及在外部使用Navicat连接

vscodec语言怎么不能在外部运行直接退出

java中创建String数组的问题

如何在模板化类的私有部分中创建模板化结构