内部类的通用数组创建编译错误

我正在尝试使用generics实现链接集合,如下所示。

public class A { private class B { private B[] b; private E item; private B() { this.b = new B[2]; } } // end inner class B } // end class A 

A是集合,B是集合中的元素或节点,其中包含引用后继者/前任者和项目的数组。

不允许创建数组。 我得到的错误是generic array creation 。 我是否认为它实际创建的是一个A.B的数组?

如果没有,导致错误的原因是什么?

如果是这样,我该如何解决这个问题呢?

我显然省略了大量代码,如果我提供的内容不够,请告诉我。 任何意见,将不胜感激。 谢谢。

编辑1:我应该提到参数化类型在A必须与B相同。 因此,将传递给内部类是不可能的,因为它创建了E#2并且留下A带有E#1 A

你调用Binheritance外部类的generics,因为它不是静态的。 你不能只是让它静止,因为它也需要E

所以你的Bb数组确实需要一个通用类型,即A.B或者如果你将代码更改为静态内部类, AB (如果你使用private static class B )。

在Java中,由于generics的实现方式(通过擦除),数组的类型没有明确定义。 一方面,它应该是一个B数组,另一方面,它应该是一个Object数组。

最可行的解决方案似乎是使用Object[]并显式转换。 如果你想增加类型安全性,你当然可以使用一个ArrayList ,它也在内部使用Object[]

在你特定的代码中, B b1, b2; 也可能是一个实际上更快(没有边界检查)并且需要更少内存(没有数组对象;没有大小信息)的选项。

B是非静态内部类。 这意味着它具有对封闭类的实例的引用。 所以它是由外类的类型参数隐式参数化的。 所以当你写B ,它意味着A.B 。 要创建数组,您应该使用原始类。 但是, B不是原始类; 引用你需要明确限定它的原始类: AB

所以这就是你想要的:

 this.b = new AB[2]; 

您还需要将E传递给内部类

  private class B { private B[] b; private E item; private B() { this.b = new B[2]; } } // end inner class B