java - 无法创建外部类<TO>.内部类的通用数组

标签 java arrays generics

我有这个代码

public class OuterClass<T> {
    public OuterClass() {
        InnerClass[] array = new InnerClass[4]; // compile-error
    }

    private class InnerClass {

    }
}

由于无法在我创建数组的行中创建 OuterClass.InnerClass 的通用数组,因此无法编译。

为什么会这样?我该如何修复/解决它?

最佳答案

InnerClass是一个非静态内部类。 OuterClass 的非静态成员都在类型参数 T 的范围内的OuterClass 。这意味着 InnerClass是隐式通用的

每次在 OuterClass 的实例上下文中你在哪里写 InnerClass ,在没有明确限定它的情况下,它被隐式地视为 OuterClass<T>.InnerClass 。所以当你写的时候

InnerClass[] array = new InnerClass[4];

编译器将其视为

OuterClass<T>.InnerClass[] array = new OuterClass<T>.InnerClass[4];
//                                                ^
// see? you are using "new" to create an array of a parameterized type

即使该参数物理上并不位于InnerClass上,位于 OuterClass ,它仍然是 InnerClass 的类型参数,只是写在不同的位置。

正如您所知,Java 中不允许创建参数化类型的数组。就像List<T>[] = new List<T>[4];一样是不允许的。

那么创建泛型类型数组的通常解决方法是什么?您可以创建原始类型的数组:

List<T>[] = new List[4]; // legal

或者通配符参数化类型:

List<T>[] = (List<T>[])new List<?>[4]; // legal

现在回到内部类的问题。在这种情况下,原始类型是什么?它不是InnerClass ,因为正如我们所见,它隐式参数化为 T 。我们必须明确限定 InnerClass与原始OuterClass获取原始InnerClass :

InnerClass[] = new OuterClass.InnerClass[4]; // legal

或者使用通配符参数化类型(同样,我们必须将通配符放在 OuterClass 上):

InnerClass[] = (InnerClass[])new OuterClass<?>.InnerClass[4]; // legal

关于java - 无法创建外部类<TO>.内部类的通用数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25087391/

相关文章:

c++ - 如果我在 C++ 中删除了一次数组,但分配了多次怎么办?

c# - 在 C# 中创建具有 'foreach' 循环的字符串数组

generics - 如何在执行动态调度的 Rust 中实现泛型函数?

java - 如何用Java从SharePoint Server下载和上传文件?

java - 将带有 Intent 的数组发送到不同的包

java - 为什么线程创建的数组会返回空指针异常?

java - Vaadin View - 导航器无法解析

java - 可以通过将元素放在数组末尾并减小数组大小来从数组中删除元素吗?

Java - 泛型类的集合,每个类都有不同的泛型类型

c# - 无法将新实例添加到泛型类中的泛型列表。为什么?