【问题标题】:I'm getting a ClassCastException event though the types are the same. Why?尽管类型相同,但我收到了 ClassCastException 事件。为什么?
【发布时间】:2011-12-05 19:42:42
【问题描述】:

我对 Java 并不陌生,虽然我之前从未真正使用过 Sets, 所以有人可以帮我吗?

我遇到以下问题; 但首先,这是我的代码:

HashMap<Position[], String> save = io.getSave();

Position[][] saved_pos = (Position[][]) save.keySet().toArray();

虽然在第二行,Java 抛出了ClassCastException,但为什么呢? 显然,save.keySet().toArray() 返回的数组确实包含Position[][]s,尽管不幸的是,Set 类中的toArray() 只返回一个Object[] 数组。

那我能做什么,我需要施放这个。

【问题讨论】:

  • 我很想知道你为什么使用位置有你的钥匙。 Aka 你为什么在 HashMap&lt;Position[], String&gt; 而不是 HashMap&lt;String, Position[]&gt;
  • 二维数组Position[][]是什么意思?
  • @hovanessyan:表示元素类型为Position[] 的数组。 (换句话说,一个“锯齿状数组”。)

标签: java class exception casting


【解决方案1】:

toArray() 方法实际上并不知道它被一组Position[]s 调用;它所知道的是它正在被调用。 (这是因为泛型在 Java 中是如何实现的;在运行时可用的信息并不多。)因此,它只返回一个充满Partition[]s 的Object[],而不是返回一个真正的Partition[][]。 (区别在于Object[]可以包含任意对象——在你调用之后,写saved_pos[0] = new Object()是有效的——而真正的Partition[][]会引发ArrayStoreException,如果你试图将其元素之一设置为new Object()。)

幸运的是,有一个单独的toArray(...) 方法可以使用,您可以在其中告诉它您想要什么数组类型,如下所示:

Position[][] saved_pos = save.keySet().toArray(new Position[0][]);

【讨论】:

    【解决方案2】:

    你需要

        Set<Position[]> positions = save.keySet();
        Position[][] saved_pos = positions.toArray(new Position[positions.size()][]);
    

    【讨论】:

      【解决方案3】:
      Position[][] saved_pos = save.keySet().toArray(new Position[0][])
      

      您需要这个,因为 Java 无法将 Object[][] 转换为 Position[][]

      【讨论】:

        【解决方案4】:

        默认的 toArray 只返回一个对象而不是位置,你必须传递你想要的对象类型 toArray 来返回你,

        你的代码将被修改为

        save.keySet().toArray(new Position[][]{}); // Yes a blank Position[][] will do
        

        【讨论】:

          猜你喜欢
          • 2022-07-01
          • 2021-10-02
          • 2022-12-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-21
          • 2019-09-17
          • 2020-08-02
          相关资源
          最近更新 更多