Intereting Posts
Сборник процессов Котлина в параллель? Чистая архитектура приложений для Android: если на уровне данных есть свои классы моделей? Сбой Gradle не удалось с Gradle 3.3 Тип универсального парного типа для дополнительных целей Как получить аргументы фактического типа для параметра reified generic в Котлин? Ярлык для «Преобразовать java-код (не файл) в kotline" Запуск модульных тестов не вызывает изменений BLE не может подключиться к уже подключенному устройству Kotlin RuntimeInvisibleParameterAnnotations: MyType (String) Как запустить метод suspend посредством отражения? Ошибка при загрузке приложения IBM Bluemix Cloud Foundry SpringBoot Какой самый элегантный способ удалить слушателя из списка из обратного вызова Доступ к статическому полю из Java-суперкласса RxKotlin flattenAsObservable (): несоответствие типа с ссылкой на метод Возможность аутентификации пользователя в режиме Firebase, но не может хранить данные в базе данных Firebase

Вывод типа для типов лямбда-параметров

Kotlin не может скомпилировать этот код, потому что, поскольку компилятор заявляет: «Ошибка: Smart cast to« Nothing »невозможен, потому что« Аккумулятор »представляет собой сложное выражение"

Вы старая функция называется то, что вы ожидаете, т. Е. Я хочу вернуть indexOfMax – но главное, что понимает, почему «умный литье» не удалось наложить на accumulator Int

 fun indexOfMax(a: IntArray): Int? { return a.foldIndexed(null) { index, accumulator, element -> return if (accumulator is Int) { var i:Int = accumulator return if (accumulator == null) index else if (element > a[i]) index else accumulator } else accumulator } } 

редактировать

да, принятый ответ работает! Вот решение:

 fun indexOfMax(a: IntArray): Int? { return a.foldIndexed(null as Int?) { index, accumulator, element -> if (accumulator == null) index else if (element >= a[accumulator]) index else accumulator } } 

Тип accumulator здесь определяется только из аргумента начального значения, который является null . Что null имеет тип Nothing? , После проверки того, что тип accumulatorInt , вы получаете свой тип smartcasted на пересечение Nothing? и Int , что приводит к Nothing .

Решение здесь заключается в том, чтобы явно указать либо параметры типа функции, либо указать тип аргумента:

 a.foldIndexed(null as Int?) { ... // or a.foldIndexed<Int?>(null) { ...