Java I';我得到一个ClassCastException事件,尽管类型相同。为什么?

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();

我对Java不是太陌生,尽管我以前从未真正使用过
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