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

时间:2012-05-20 07:51:08

标签: java arrays generics

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

public class A<E> {

  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<E>.B的数组?

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

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

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

编辑1:我应该提到A中的参数化类型必须与B中的参数化类型相同。因此,无法将<E>传递给内部类,因为它会创建E#2并将A留给E#1

3 个答案:

答案 0 :(得分:4)

你调用B继承外部类的泛型,因为它不是静态的。而且你不能只是让它静止,因为它也需要E

因此,您的B.b数组确实需要一个通用的类型,即A<E>.B,或者如果您将代码更改为 static 内部类,{{1 (如果你使用A.B<E>)。

在Java中,由于泛型的实现方式(通过擦除),数组的类型没有明确定义。一方面,它应该是private static class B<E>的数组,另一方面,它应该是B的数组。

最可行的解决方案似乎是使用Object并明确转换。 如果您想提高类型安全性,当然可以使用内部使用Object[]的{​​{1}}!

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

答案 1 :(得分:2)

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

所以这就是你想要的:

this.b = new A.B[2];

答案 2 :(得分:-2)

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

 private class B<E> {

            private B[] b;
            private E item;

            private B() {
                this.b = new B[2];
            }

        } // end inner class B