Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 内部类中的泛型数组创建编译错误_Java_Arrays_Generics - Fatal编程技术网

Java 内部类中的泛型数组创建编译错误

Java 内部类中的泛型数组创建编译错误,java,arrays,generics,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[]B; 私人电子物品; 二等兵乙(){ this.b=新的

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

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[]B;
私人电子物品;
二等兵乙(){
this.b=新的b[2];
}
}//结束内部类B
}//末级A
A是集合,B是集合中的元素或节点,数组引用继承者/前置者和项

不允许创建数组。我得到的错误是
通用数组创建
。我认为它实际上创建的是一个A.B
A.B
数组,对吗

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

如果是这样的话,我该怎么做

我显然遗漏了大量的代码,如果我提供的不够,请让我知道。如有任何建议,将不胜感激。多谢各位


编辑1:我应该提到
A
中的参数化类型必须与
B
中的参数化类型相同。因此,将
传递给内部类是不可能的,因为它会创建
E#2
并将
A
E#1
一起离开

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

 private class B<E> {

            private B[] b;
            private E item;

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

        } // end inner class B
私有B类{
私人B[]B;
私人电子物品;
二等兵乙(){
this.b=新的b[2];
}
}//结束内部类B

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

因此,您的
B.B
数组确实需要一个泛型类型,即
a.B
,或者如果您要将代码更改为静态内部类,
a.B
(如果您要使用
私有静态类B

在Java中,由于泛型的实现方式(通过擦除),数组的类型没有得到很好的定义。一方面,它应该是
B
的数组,另一方面,它应该是
对象的数组

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


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

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

这就是你想要的:

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

对根据我的编辑,我要求外部类和内部类中的类型都相同。执行上述操作将意味着,尽管它们可能都被转换为相同的类型,比如说
A
使它们都成为整数,但它们在引用两者时不可比较或兼容。对不起,我看不到任何好处。在您的设置中,它实际上应该是
私有静态类B
,以避免名称重载,并且它仍然不允许创建
新B[2]
数组。这并不是对您问题的具体回答,但更好的设计是使用两个类型为B的变量“前置变量”和“后继变量”,而不是两个元素的数组。会让你的课更容易阅读。我想这也会让你的问题消失?WRT Edit1,尝试一个
静态类B
,你就不会有命名问题了。不过,数组仍然无法工作,因为它是泛型的。你也可以通过使用泛型集合而不是数组来解决这个问题。如果
b
确实总是有两个元素,那么最好使用两个字段。我曾想过使用单独的b1、b2引用。看来这是最合适的方式。在某些方法中,它只会使集合的遍历更加复杂。感谢您的反馈,非常有帮助。