
[英]Why cant i register a non-regular type Arraylist<> into an ArrayList<>?
[英]Why cant i add a generic type parameter into an ArrayList?
下面第一行注释中的代码显示“城市无法转换为T”。 因此,在下一行中,我将其强制转换为T。在主程序中编译方法“ testing”后,它将引发以下异常:“线程“ main”中的异常java.lang.ClassCastException:[Ljava.lang.Object;不能是强制转换为[Lapi.xapi.City;“
谁能解释为什么会这样,并在可能的情况下找到解决方案?
提前致谢。
顺便说一句,我需要从MyMap类中的City类访问一些方法,并且我只能在没有其他方法的情况下使用强制类型转换。
public class MyMap <T extends City> extends DirectedGraph<City> {
public void add(T vertex) {
super.addVertex(vertex);
}
public void testing(T vertex) {
ArrayList<T> x = new ArrayList<>();
//x.add(super.vertices[0]);
x.add((T) super.vertices[0]);
}
}
信息更新:很抱歉缺少信息。
这是超类DirectedGraph:
public class DirectedGraph<T>{
protected final int DEFAULT_CAPACITY=15;
protected T[] vertices;
protected double[][] edges;
protected int numVertices;
public DirectedGraph() {
this.vertices = (T[]) (new Object[DEFAULT_CAPACITY]);
this.edges = new double[DEFAULT_CAPACITY][DEFAULT_CAPACITY];
}
public void addVertex(T vertex) {
this.vertices[this.numVertices] = vertex;
this.numVertices++;
}
}
您将T限制为City的子类型,我猜测super.vertices返回的是City或Object的超级类型。 通过强制转换为T,您告诉编译器“相信我,我知道它是City的子类型”
请考虑发布的一些更正,作为对您的问题的评论。
我假设主体看起来像这样:
public static void main(String args[]) {
new MyMap<City>().testing(new City());
}
然后,关于“向T
广播失败”的原因:
实例化new MyMap<City>()
,它实际上会尝试创建City []
,但是将其分配给Object []
。 编译器允许这样做,因为在使用泛型和类型擦除时,此时没有错误。 编译器只是不知道它可以得到除Object []
之外的任何东西。
可以提供一些解决方案,所有这些问题都使您质疑是否不应该将应用程序的设计带回绘图板,然后重新考虑。 但是,以下是一些选项:
您将必须以某种方式传递类型。 这可以通过传递T类,T的实例或T的预先存在的数组来实现。我提供了第二种解决方案,它将使初始化如下所示:
public DirectedGraph(Class<? super T> class) {
this.vertices = (T[]) Array.newInstance(clazz, DEFAULT_CAPACITY);
this.edges = new double[DEFAULT_CAPACITY][DEFAULT_CAPACITY];
}
然后对于MyMap,由于父级中的默认构造函数在DirectedGraph
消失了(我们添加了一个参数),因此您必须在MyMap
添加一个:
public MyMap() {
super(City.class);
}
通过这些代码更改,我只走了一步。 但是,由于我的初始化逻辑不完整,或者由于它具有其他问题,因此会弹出下一个无关的错误。
我想链接以下帖子:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.