当我在Kotlin中使用委托时,MutableMap <String,Any>如何将值传递给var?

以下示例代码来自网页。 我明白,这些变数,城市和国家的价值由代表。

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

我必须首先通过这些关键的价值来映射吗? 例如map [“_ id”] = 132L,map [“city”] =“Wuha”和map [“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 } } 

首先,您需要了解授权财产是如何运作的。 对象不直接拥有委​​托的属性。 它只拥有代表。 例如, 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 [“_ id”] = 132L,map [“city”] =“Wuha”和map [“country”] =“USA”?

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

如果没有地图[“_ id”]会怎么样? 将代码var _id:Long由map导致错误?

当然,会有例外。

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

此外,如果您不需要显式地使用HashMap()则应该使用mutableMapOf()而不是HashMap()