我得到一个ClassCastException事件虽然类型是相同的。为什么?

时间:2011-12-05 19:42:43

标签: java class exception casting

我对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>

所以我能做什么,我需要投这个。

4 个答案:

答案 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