Почему myDayForecast.map пуст?

Я создаю объект myDayForecast со вторичной конструкцией, я думаю, что var bb будет пустым, потому что парматер вторичной конструкции, который переходит к основной конструкции, – 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 } } 

Изображение результатов

введите описание изображения здесь

В конце, если строка определения вспомогательного конструктора:

 constructor(date: Long, description: String, high: Int, low: Int, iconUrl: String, cityId: Long) : this(HashMap()) { 

: this(HashMap()) – вызов основного конструктора:

 DayForecast(var map: MutableMap<String, Any?>) 

но с пустым HashMap в качестве аргумента.

Поэтому, когда вы делаете звонок:

 var myDayForecast=DayForecast(15L,"Desciption",10,5,"http://www.a.com",10L) 

одна из первых вещей, которая происходит, заключается в том, что первичный конструктор вызывается с пустой HashMap, как указано выше.

Это как если бы вы назвали основной конструктор следующим образом:

DayForcast (map = HashMap ())

Итак, теперь карта была установлена ​​на пустой HashMap.

Во вторичном конструкторе каждое из полей помечено map , где map – свойство MutableMap DayForecast. как показано здесь:

 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 , которая в этом случае является объектом MutableMap . Для объекта MutableMap это означает, что компилятор переводит вызовы, такие как this.date = 15L в нечто подобное this.map.put («date», 15L), а ссылки, такие как blah = this.date будут переведены на что-то вроде: blah = this.map.get("date")

Затем, после вызова первичного конструктора, выполняется вторая часть вторичного конструктора.

  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) , который заполняет первоначально пустую HashMap значениями, так что время, которое вы вызываете

var bb=myDayForecast.map , теперь карта заполнена HashMap.

Пожалуйста, ознакомьтесь с разделом свойств делегата документации Kotlin, если это все еще запутывает.

Вы используете карту для хранения ваших данных о собственности . Это делается с помощью by map и работает для получения и настройки. Назначив значение свойствам, вы добавляете элементы на карту. Поэтому изначально ваш HashMap пуст, но в конце конструктора вы добавили значения к нему неявно. Kotlin не создает другое поле или механизм для хранения значений в противном случае.