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.BA.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引用。看来这是最合适的方式。在某些方法中,它只会使集合的遍历更加复杂。感谢您的反馈,非常有帮助。