【问题标题】:Generic Array Creation Compilation Error From Inner Class内部类的通用数组创建编译错误
【发布时间】:2012-05-27 03:43:15
【问题描述】:

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

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&lt;E&gt;.B 的数组是否正确?

如果不是,是什么导致了错误?

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

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

编辑 1: 我应该提到A 中的参数化类型必须与B 中的相同。所以将&lt;E&gt; 传递给内部类是不可能的,因为它会创建E#2 并将AE#1 分开。

【问题讨论】:

  • 不是专门回答您的问题,但最好设计两个变量“前驱”和“后继”类型 B,而不是两个元素的数组。将使您的课程更易于阅读。我想这也会让你的问题消失?
  • WRT Edit1,尝试static class B&lt;E&gt;,您将不会遇到命名问题。但是,该数组仍然无法工作,因为它是通用的。
  • 你也可以通过使用泛型集合而不是数组来解决这个问题。
  • 如果b 确实总是有两个元素,那么最好使用两个字段。

标签: java arrays generics


【解决方案1】:

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

所以你的B.b 数组确实需要一个泛型类型,即A&lt;E&gt;.B,或者如果你将代码更改为static 内部类,A.B&lt;E&gt;(如果你愿意使用private static class B&lt;E&gt;)。

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

最可行的解决方案似乎是使用Object[] 并显式转换。 如果你想提高类型安全性,当然可以使用ArrayList&lt;B&gt;,它内部也使用Object[]

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

【讨论】:

  • 我曾想过使用单独的 b1、b2 引用。看来这是最合适的方式了。它只是在某些方法中使集合的遍历更加复杂。感谢您的反馈,非常有帮助。
【解决方案2】:

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

这就是你想要的:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 是的。根据我的编辑,我要求外部类和内部类中的类型相同。执行上述操作将意味着尽管它们可能都变成了相同的类型,比如A&lt;Integer&gt; 使它们都是整数,但在两者之间引用时它们是不可比较或不兼容的。
    • 抱歉,我没有看到任何好处。在您的设置中,恕我直言,它实际上应该是 private static class B&lt;E&gt; 以防止名称重载,并且仍然不允许创建 new B[2] 数组。
    猜你喜欢
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 2010-11-03
    • 2015-02-04
    相关资源
    最近更新 更多