为什么myDayForecast.map没有空?

时间:2017-11-08 09:21:49

标签: android kotlin

我创建了一个具有二级构造的对象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
    }
}

结果图片

enter image description here

2 个答案:

答案 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部分。