我有这个代码
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/