我对Java不太新,虽然我以前从未真正使用过Set
s,
那么请有人帮帮我吗?
我遇到以下问题; 但首先,这是我的代码:
HashMap<Position[], String> save = io.getSave();
Position[][] saved_pos = (Position[][]) save.keySet().toArray();
虽然在第二行,Java会抛出ClassCastException
,但为什么呢?
显然,save.keySet().toArray()
返回的数组确实包含Position[][]
s,但遗憾的是,类toArray()
中的Set
只返回Object[]
数组。 / p>
所以我能做什么,我需要投这个。
答案 0 :(得分:7)
toArray()
方法实际上并不知道它是在一组Position[]
s上调用的;它只知道它是在一组上被调用的。 (这是因为在Java中如何实现泛型;在运行时没有太多信息可用。)因此,它只返回Object[]
个Partition[]
个,而不是返回一个真{ {1}}。 (不同之处在于Partition[][]
可以包含任意对象 - 在您通话后写入Object[]
会有效 - 而真正的saved_pos[0] = new Object()
会提升如果您尝试将其中一个元素设置为Partition[][]
,则为ArrayStoreException
。)
幸运的是,可以使用单独的new Object()
方法,您可以告诉它所需的数组类型,如下所示:
toArray(...)
答案 1 :(得分:0)
你需要
Set<Position[]> positions = save.keySet();
Position[][] saved_pos = positions.toArray(new Position[positions.size()][]);
答案 2 :(得分:0)
Position[][] saved_pos = save.keySet().toArray(new Position[0][])
您需要这样做,因为Java无法将Object[][]
投射到Position[][]
。
答案 3 :(得分:0)
默认的toArray只返回一个Object而不是Position,你必须传递你想要的Object类型返回给你,
您的代码将被修改为
save.keySet().toArray(new Position[][]{}); // Yes a blank Position[][] will do