以下示例代码来自网页。我知道这些变量_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
}
}
答案 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()
。