Функции расширения Kotlin внезапно требуют уровня API 24

Я только что заметил эту ошибку lint:

Для вызова требуется уровень API 24 (текущий минимум 19) java.util.map#foreach

когда я использую функцию расширения forEach на MutableMap в Kotlin. Этого не было, когда я писал строчку, но она есть сейчас. И я не вижу эту ошибку на моей другой машине.


person Sebastian Rüttger    schedule 25.06.2017    source источник
comment
Попробуйте аннулировать кеш и запустить gradle clean, так как другая ваша машина не получает эту ошибку. Также проверьте ответ Наэтмула ниже.   -  person glee8e    schedule 26.06.2017
comment
Хотя ответ Наэтмула кажется причиной вашей проблемы, в настоящее время я все равно вижу много этих предупреждений без всякой причины в AS3.0, даже в таких вещах, как Bundle#putBoolean. Linting кажется немного сломанным в настоящее время.   -  person ditn    schedule 26.06.2017
comment
Если вы недавно проходили мимо после перехода на Kotlin 1.5.0, в AGP 4.1 есть ошибка Lint, вызывающая аналогичные проблемы. Подробнее см. на странице issuetracker.google.com/issues/185418482. TL;DR вам нужно сначала обновиться до AGP 4.2.0   -  person Konsumierer    schedule 19.05.2021


Ответы (3)


То, что вы используете, не kotlin.collections.MutableMap.forEach.

То, что вы используете, похоже, Map.forEach в Java 8.

Обратитесь к этой статье: http://blog.danlew.net/2017/03/16/kotlin-puzzler-чьей-линии-это-влюбомслучае/

Кажется, это распространенная ошибка.

Java 8 хорошо поддерживается, начиная с уровня Android API 24.

Короче говоря, не используйте forEach как map.forEach { t, u -> Log.i("tag", t + u) } (здесь используется API Java 8, который не работает для уровня Android API ‹= 23).
Используйте его как map.forEach { (t, u) -> Log.i("tag", t + u) } (это использует API Kotlin).
(Не два параметра. Только один параметр, являющийся парой.)

person Naetmul    schedule 26.06.2017
comment
это решило это для меня. То же самое происходит для replace() на MutableMap, поэтому я предполагаю, что это та же причина. - person Sebastian Rüttger; 26.06.2017
comment
двойной принятый ответ. это позволяет мне использовать forEach на kotlin. - person mochadwi; 20.02.2019
comment
Файл полностью написан на Котлине, и все равно выдает эту ошибку. Невозможно использовать Java 8 из Kotlin. - person IgorGanapolsky; 12.07.2019
comment
@IgorGanapolsky Обычно вы используете Kotlin с некоторыми библиотеками Java, поэтому версия этих библиотек для Java может иметь значение. Версия j.u.Map.forEach с двумя аргументами относится к Java 8 и более поздним версиям, то есть к Android API 24 и более поздним версиям. - person Ricky Clarkson; 04.05.2021
comment
@Naetmul Какова связь между функциями языка Java и уровнями Android API? - person Sourav Kannantha B; 06.05.2021
comment
@SouravKannanthaB Уровень Android API ‹= 23: Java 7, уровень Android API ›= 24: Подмножество Java 8, developer.android.com/studio/write/java8-support.html Похоже, что Google не пытается включить функции языка Java 9 в Android. Просто используйте вместо этого Kotlin. - person Naetmul; 11.05.2021
comment
Кстати, я обнаружил, что та же проблема снова появилась после обновления kotlin 1.5.x. Эта проблема уже исправлена ​​в версии 4.2: issuetracker.google.com/issues/185418482. - person neworld; 15.06.2021
comment
Я использую версию с одним аргументом, и эта проблема возникла у меня только что. ссылка event.attributes?.forEach { (key, value) -> if (key != null && value != null) { put(key, value) } } - person Bill Mote; 29.07.2021

Это также происходит в списке, даже если я использую, мне нужно использовать:

list.iterator().forEach {}

ключ использует iterator() перед forEach.

person Javier    schedule 28.05.2021
comment
Это решило это для меня. Я использую версию с одним аргументом, как указано в другом ответе (ссылка event.attributes?.forEach { (key, value) -> if (key != null && value != null) { put(key, value) } }). - person Bill Mote; 29.07.2021

Map.forEach поддерживается в Java 8, а его поддержка в Android началась с API 24.

person Shinoo Goyal    schedule 26.06.2017
comment
Это для Котлина - person IgorGanapolsky; 12.07.2019