我创建了一个具有二级构造的对象myDayForecast,我认为var bb将为空,因为传递给主构造的二级构造的parmater是HashMap()。 我看到一些关于HashMap()的文档,它将返回空。
但是在运行代码之后,我发现var bb不是空的(你可以看到图像),为什么?
var myDayForecast= DayForecast(15L,"Desciption",10,5,"http://www.a.com",10L)
var bb=myDayForecast.map
class DayForecast(var map: MutableMap<String, Any?>) {
var _id: Long by map
var date: Long by map
var description: String by map
var high: Int by map
var low: Int by map
var iconUrl: String by map
var cityId: Long by map
constructor(date: Long, description: String, high: Int, low: Int, iconUrl: String, cityId: Long)
: this(HashMap()) {
this.date = date
this.description = description
this.high = high
this.low = low
this.iconUrl = iconUrl
this.cityId = cityId
}
}
结果图片
答案 0 :(得分:3)
你正在使用map to store your property data。这是通过by map
完成的,适用于获取和设置。通过为属性指定值,可以向地图添加元素。所以最初你的HashMap
是空的,但是在构造函数的末尾,你隐式地为它添加了值。 Kotlin 不会创建另外的字段或机制来存储值。
答案 1 :(得分:2)
在最后,如果辅助构造函数定义行:
DayForecast(var map: MutableMap<String, Any?>)
var myDayForecast=DayForecast(15L,"Desciption",10,5,"http://www.a.com",10L)
是对主构造函数的调用:
by
但是以空HashMap作为参数。
所以当你打电话时:
map
首先发生的事情之一是使用空HashMap调用主构造函数,如上所述。
这就像你这样调用主构造函数一样:
DayForcast(map = HashMap())
所以现在map已经设置为一个空的HashMap。
在辅助构造函数中,每个字段都标有map
class DayForecast(var map: MutableMap<String, Any?>) {
var _id: Long by map
var date: Long by map
var description: String by map
var high: Int by map
var low: Int by map
var iconUrl: String by map
var cityId: Long by map
...
}
,其中map
是DayForecast的MutableMap属性。如下所示:
MutableMap
这意味着对这些字段的任何访问权限都委托给this.date = 15L
引用的对象,在这种情况下是blah = this.date
对象。对于MutableMap对象,这意味着编译器会将诸如blah = this.map.get("date")
之类的调用转换为this.map.put(&#34; date&#34;,15L)之类的调用,以及 this.date = date
this.description = description
this.high = high
this.low = low
this.iconUrl = iconUrl
this.cityId = cityId
之类的引用将是翻译成var propXYZ by map
接下来,在调用主构造函数之后,运行辅助构造函数的第二部分。
this.map.put("date", date)
现在,因为每个属性都声明为var bb=myDayForecast.map
这些调用中的每一个都被转换为{{1}}之类的调用,它将使用值填充最初为空的HashMap,以便在您调用时
{{1}},map现在填充了HashMap。
如果这仍然令人困惑,请查看Kotlin文档的delegate-properties部分。