Почему вызов put () не компилируется в Kotlin, когда он компилируется в Java с похожим кодом - PullRequest
3 голосов
/ 23 июня 2019

У меня есть следующая функция в Java, и мне нужно преобразовать ее в Kotlin.

@Override
public void afterTextChanged(Editable s) {

    if (s != null && !"".equals(s.toString())) {
        int position = (Integer) mHolder.numEdit.getTag();
        // Saved to the data variable when the data changes
        mData.get(position).put("list_item_inputvalue",
                s.toString());
    }
}

Это эквивалентный код Kotlin, который я создал:

override fun afterTextChanged(s: Editable?) {

    if (s != null && "" != s.toString()) {
        val position = mHolder.numEdit!!.tag as Int
        // Saved to the data variable when the data changes
        mData?.get(position).put("list_item_inputvalue", s.toString())
    }
}

Компилятору не нравится вызов .put(). Переменная mData в Java:

private List<Map<String, String>> mData;

и Котлин:

var mData: List<Map<String, String>>? = null

Почему компилятору не нравится преобразование put в Kotlin?

UPDATE:

println(mData) = [{list_item_inputvalue=0}, {list_item_inputvalue=1},...]

println(mData?.get(position)) = {list_item_inputvalue=8}

error

Код на Java

Ответы [ 2 ]

8 голосов
/ 23 июня 2019

Ваша проблема сосредоточена вокруг этого утверждения в вашем вопросе:

var mData: List<Map<String, String>>? = null

В Kotlin тип Map является неизменным и поэтому не имеет метода .put(). Это проблема, с которой вы сталкиваетесь. Чтобы исправить это, просто измените это утверждение на:

var mData: List<MutableMap<String, String>>? = null

Второй '?' необходимо после mData?.get(position), потому что этот оператор вернет null, если mData == null. То есть этот оператор возвращает тип MutableMap<String, String>?, хотя сам по себе .put() возвращает тип MutableMap<String, String>.

Подводя итог ... если вы создадите список изменяемых карт, то компилятор будет рад заявлению:

mData?.get(position)?.put("list_item_inputvalue", s.toString())
4 голосов
/ 23 июня 2019

Изначально не было ясно, что именно было задано, поэтому давайте начнем с различных элементов синтаксиса здесь:

  • !!: оператор утверждения, не равный нулю (!!) преобразует любое значение в ненулевой тип и создает исключение, если значение равно нулю.Мы можем написать b !!, и это будет возвращать ненулевое значение b (например, строку в нашем примере) или бросить NPE, если b равно нулю (цитируется kotlinlang )
  • [position]: Квадратные скобки переводятся в вызовы для получения и установки с соответствующим количеством аргументов. (опять же, из kotlinlang ) Другими словами: это просто«Синтаксический» сахар: вы можете рассматривать коллекцию (возможно, список) как массив.Значение: вместо записи get(index) для обозначения элемента в списке, вы можете просто пойти [index], как если бы это был обычный массив.

Kotlin позволяет использовать someMap[someKey] для его собственные карты.Таким образом, чтобы ответить на начальный вопрос, дальнейшее «преобразование» могло бы заменить вызов на put() также в квадратных скобках.

В этом случае вы должны учитывать тот факт, что карты Котлина являются неизменяемыми по умолчанию (поэтому при использовании mapOf() вы получаете неизменную карту).Или, если вы хотите иметь изменяемую карту Котлина «вокруг» карты Java, вы должны использовать mutableMapOf()!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...