5

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

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:我应该提到参数化类型必须与 inA相同B。所以传递<E>给内部类是不可能的,因为它创建并E#2离开A.E#1

4

3 回答 3

4

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

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

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

最可行的解决方案似乎是Object[]显式使用和强制转换。如果您想提高类型安全性,当然可以使用ArrayList<B>内部使用的 an Object[]

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

于 2012-05-20T08:20:28.677 回答
2

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

所以这就是你想要的:

this.b = new A.B[2];
于 2012-05-21T18:02:39.367 回答
-2

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

 private class B<E> {

            private B[] b;
            private E item;

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

        } // end inner class B
于 2012-05-20T08:00:08.343 回答