Что сделает 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
Как я могу реплицировать несколько первичных конструкторов? Класс данных Котлина с производными свойствами Kotlin – getPendingIntent с синтаксисом нескольких флагов AssertionError: пакет корней должен быть инициализирован Несоответствие типов в ArrayOfNulls с Kotlin GL_INVALID_OPERATION на glBufferData () в kotlin Kotlin – общий параметр в List – сочетание Java и Kotlin Получить случайный элемент из списка с использованием потоков kotlin почему kotlin использует === сравнить примитивный тип, равный друг другу, если они имеют одинаковое значение Правила ProGuard для отражения Котлина Как использовать RxJava2 combLatest со списком наблюдаемых в Котлине Ошибка: (2, 0) Не удалось найти метод 'org.gradle.api.internal.file.DefaultSourceDirectorySet Выполнение не выполнено для задачи ': app: compileDebugKotlin'. > Внутренняя ошибка компилятора. Подробнее см. Журнал Есть ли способ потребовать, чтобы общий тип был классом данных в Котлин? Определение оси масштабирования ScaleAnimation