Java I';我得到一个ClassCastException事件,尽管类型相同。为什么?
我对Java不是太陌生,尽管我以前从未真正使用过Java I';我得到一个ClassCastException事件,尽管类型相同。为什么?,java,class,exception,casting,Java,Class,Exception,Casting,我对Java不是太陌生,尽管我以前从未真正使用过Sets, 有人能帮我吗 我有以下问题; 但首先,这是我的代码: HashMap<Position[], String> save = io.getSave(); Position[][] saved_pos = (Position[][]) save.keySet().toArray(); HashMap save=io.getSave(); 位置[][]保存的位置=(位置[][])保存.keySet().toArray();
Set
s,
有人能帮我吗
我有以下问题;
但首先,这是我的代码:
HashMap<Position[], String> save = io.getSave();
Position[][] saved_pos = (Position[][]) save.keySet().toArray();
HashMap save=io.getSave();
位置[][]保存的位置=(位置[][])保存.keySet().toArray();
虽然在第二行,Java抛出了一个ClassCastException
,但是为什么呢?
显然,由save.keySet().toArray()
返回的数组确实包含Position[][]
s,尽管不幸的是,类Set
中的toArray()
只返回对象[]
数组
所以我能做什么,我需要转换这个。toArray()方法实际上并不知道它正在一组位置[]
上被调用;它所知道的只是它在一个集合中被调用。(这是因为泛型是如何在Java中实现的;在运行时没有太多信息可用。)因此,它只返回一个对象[]
充满分区[]
s,而不是返回一个真正的分区[]
。(区别在于对象[]
可以包含任意对象-调用后写入已保存的\u pos[0]=new Object()
,这是有效的-而如果试图将其元素之一设置为new Object()
,则真正的分区[]
将引发ArrayStoreException
)
幸运的是,有一个单独的toArray(…)
方法可以使用,您可以告诉它您想要什么数组类型,如下所示:
Position[][] saved_pos = save.keySet().toArray(new Position[0][]);
你需要
Set<Position[]> positions = save.keySet();
Position[][] saved_pos = positions.toArray(new Position[positions.size()][]);
Set positions=save.keySet();
Position[][]保存的位置=positions.toArray(新位置[positions.size()][]);
您需要它,因为Java无法将
对象[][][]
强制转换为位置[][]
默认toArray只返回一个对象,而不返回位置,您必须传递要toArray返回的对象类型
您的代码将被修改为
save.keySet().toArray(new Position[][]{}); // Yes a blank Position[][] will do
我很想知道你为什么要用你的钥匙。Aka为什么你在做
HashMap
而不是HashMap
?二维数组位置[][]的含义是什么?@hovanesyan:它意味着其元素的类型为Position[]
。(换句话说,就是“锯齿阵列”。)
save.keySet().toArray(new Position[][]{}); // Yes a blank Position[][] will do