当我在Kotlin中使用委托时,MutableMap <string,any?=“”>如何将值传递给var?

时间:2017-11-02 00:28:48

标签: kotlin

以下示例代码来自网页。我知道这些变量_id,城市和国家可以通过代表获得价值。

我无法理解map:MutableMap如何将值传递给这些vars _id,city和country?

我必须首先将这些键的值传递给地图吗?例如map [“_ id”] = 132L,map [“city”] =“Wuha”和地图[“country”] =“USA”?

如果没有地图[“_ id”]会发生什么?代码var _id: Long by map会导致错误吗?

class CityForecast(val map: MutableMap<String, Any?>, val dailyForecast: List<DayForecast>) {
    var _id: Long by map
    var city: String by map
    var country: String by map

    constructor(id: Long, city: String, country: String, dailyForecast: List<DayForecast>)
        : this(HashMap(), dailyForecast) {
        this._id = id
        this.city = city
        this.country = country
    }
}

1 个答案:

答案 0 :(得分:2)

首先,您需要了解委托属性的工作原理。 Object不直接拥有委​​托属性。它只拥有代表。例如,var _id: Long by map实际上看起来像

var _id: Long
    get() {
        val value = map["_id"] as? Long
        if (value == null)
            throw Excecption()
        return value        
    }
    set(value) {
        map["_id"] = value
    }
  

我必须首先将这些键的值传递给地图吗?例如map [&#34; _id&#34;] = 132L,map [&#34; city&#34;] =&#34; Wuha&#34;并映射[&#34; country&#34;] =&#34; USA&#34;?

不,这是一次运行时检查,就像lateinit一样。

  

如果没有地图会发生什么事[&#34; _id&#34;]?代码var _id:long by map cause error?

当然,会有例外。

请注意,对于普通班级,建议使用 NOT 。它是为JSON反序列化而设计的(尽管我仍然喜欢GSON)。建议不要这样做,因为您正在创建可以避免的潜在运行时异常,包括缺少值和类型检查。

此外,如果您不明确需要mutableMapOf(),则应使用HashMap()代替HashMap()