Что сделает HashMap (it)?

Я изучаю пример кода о «Kotlin для разработчиков Android» на странице https://github.com/antoniolg/Kotlin-for-Android-Developers

В коде .parseList { DayForecast(HashMap(it)) } , я не могу понять, что будет делать функция HashMap (it). Является ли HashMap () классом и принимает parmater?

И еще, я думаю, что полный код класса DayForecast(...).. является кодом A, правильно?

Опять же, если я создаю объект var myDayForecast=DayForecast(10L,"Desciption",10,5,"http://www.a.com",10L) , 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(map: MutableMap<String, Any?>=HashMap()) { this.date = date this.description = description this.high = high this.low = low this.iconUrl = iconUrl this.cityId = cityId } } 

Оригинальный код

 override fun requestForecastByZipCode(zipCode: Long, date: Long) = forecastDbHelper.use { val dailyRequest = "${DayForecastTable.CITY_ID} = ? AND ${DayForecastTable.DATE} >= ?" val dailyForecast = select(DayForecastTable.NAME) .whereSimple(dailyRequest, zipCode.toString(), date.toString()) .parseList { DayForecast(HashMap(it)) } val city = select(CityForecastTable.NAME) .whereSimple("${CityForecastTable.ID} = ?", zipCode.toString()) .parseOpt { CityForecast(HashMap(it), dailyForecast) } city?.let { dataMapper.convertToDomain(it) } } 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 } } 

Я думаю, что из ответа здесь вы должны уже понять, что parseList предоставляет закрытие { DayForecast(HashMap(it)) } с объектом Map .

Но как вы теперь показываете определение DayForecast

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

требует MutableMap

Основное различие между MutableMap и Map заключается в том, что Map нельзя изменить, а MutableMap можно изменить.

Причина, по которой DayForecast требует MutableMap заключается в том, что во вторичном конструкторе объект, который был передан, называется map (изменен). Это часть вашего недавнего вопроса .

HashMap – это реализация на основе Hash-таблицы интерфейса MutableMap , поэтому его можно использовать, когда ожидается MutableMap .

Итак, подведем итог:

DayForecast () ожидает, что объект MutableMap будет передан в его основной конструктор, но parseList предоставляет только Map закрытию, которое он получает, поэтому решение заключается в том, чтобы вставить HashMap() для создания MutableMap .

Это также должно ответить на вопрос, который вы задали в комментарии. Почему parseList не может использовать закрытие { DayForecast(it) } вместо { DayForecast(HashMap(it)) } ? Это потому, что, как показано выше, конструктор DayForecast () ожидает MutableMap , которого нет (это Map ), а HashMap(it) является MutableMap .

Я не могу понять, что будет делать функция HashMap(it) . Является ли HashMap() классом и принимает параметр?

Из документов HashMap(Map) :

Создает новый HashMap с теми же сопоставлениями, что и указанная Map . HashMap создается с коэффициентом загрузки по умолчанию (0,75) и начальной мощностью, достаточной для хранения отображений на указанной Map .

Чтобы ответить на ваш вопрос: да, HashMap – это класс, который принимает параметр, который должен быть экземпляром Map .

Intereting Posts
getExternalFilesDir возвращает непоследовательные каталоги Как я могу построить SQL-запрос с динамическим именем столбца в пространственной постоянной библиотеке Ошибка компиляции во время преобразования класса RealmObject в Kotlin Android – Kotlin – объект должен быть объявлен абстрактным или реализовать абстрактный элемент Spring не может обрабатывать метод, возвращающий общий внутренний класс Kotlin Правильно ли написана документация Котлина? Не могу построить проект с Android Studio 2.3 и Gradle Проблема с выпуском Android 3.0 Gradle 3.0 Статические методы расширения в Котлине Ошибка плагина Kotlin: не удалось создать прокси-класс для класса org.jetbrains.kotlin.gradle.tasks.KotlinCompile Нельзя использовать значение argb color int в Kotlin? Как запустить другой файл .kt / Class в той же папке src? Kotlin: Интерфейс с неизменяемым свойством, реализуемым классом с изменчивым Котлин Абстрактное защищенное свойство Вызов countDownTimer