【问题标题】:Putting element into HashMap with Map interface使用 Map 接口将元素放入 HashMap
【发布时间】:2015-07-16 08:55:29
【问题描述】:

我正在尝试 Kotlin,但遇到了一个无法解决的小问题。 当我有以下构造时,我可以将元素放入地图中:

val map = HashMap<String, String>()
map["asd"] = "s"
map.put("34", "354")

但是,当我使用Map 界面创建地图时,我只能读取它们,我做错了什么?

val map: Map<String, String> = HashMap<String, String>();
map.put("24", "34") //error
map["23"] = "23" //error

或者我对 Kotlin 中的接口有些困惑?

【问题讨论】:

    标签: java dictionary kotlin


    【解决方案1】:

    在第一个例子中map获取了HashMap的类型, 在第二个示例中,您将其转换为 Interface Map。

    Map是一个只读的map,没有put/set,见here

    为了能够编辑地图,您应该使用MutableMap

    【讨论】:

    • 来自 Java,重要的是要记住 Map 不是来自 java.util.Map 而是来自 Collections.kt 中定义的 Map。作为一个 Kotlin 新手,我也被这件事抓住了。如上所述 Map 是只读的;更改地图使用 MutableMap。还有一些辅助方法可以在 Maps.kt 中创建不同的地图,即 hashMapOf 等
    【解决方案2】:

    使用 kotlin 集合时,一个重要的考虑因素是,kotlin 将其集合分类为可变和不可变。这与不存在此类分类的 java 形成对比。

    在 kotlin 中,对于大多数集合,您都有一个只支持只读方法的基本接口。在您的情况下,Map&lt;K,V 就是一个例子,来自文档

    该接口中的方法只支持对地图的只读访问; 通过 MutableMap 接口支持读写访问。

    这是在val map: Map&lt;String, String&gt; = HashMap&lt;String, String&gt;(); 之后尝试修改地图时出错的原因,即使实际对象的类型为HashMap&lt;String,String&gt;,但map 引用的类型为Map&lt;String,String&gt;,它只会提供只读操作。

    现在,如果您使用实现MutableMap&lt;K,V&gt; 的类,那么您也可以将值放入映射中。 val map = HashMap&lt;String, String&gt;() 就是这种情况,因为这里 map 的类型是 HashMap&lt;K,V&gt;,它扩展了 MutableMap&lt;K,V&gt;,因此是可变的。

    【讨论】:

      猜你喜欢
      • 2019-11-02
      • 1970-01-01
      • 2019-03-21
      • 2012-01-13
      • 2013-01-12
      • 1970-01-01
      • 1970-01-01
      • 2017-08-23
      • 2020-07-27
      相关资源
      最近更新 更多