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

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) { ... 
Intereting Posts
Несоответствие типа Котлина при прохождении в параметре Анимация (прокрутка) одна ViewGroup блокирует несвязанные виды из анимации до завершения Архитектура собственного SDK – API асинхронного метода в Котлине SparkJava с использованием Kotlin и WebSockets Как показать голландский месяц с использованием Joda DateTime Конвертировать проект Android для использования Gradle Script Kotlin Доступ к типам параметров внешнего типа Возможно ли запустить последнюю версию Akka Framework (2.5.2) в Android-проекте? Метод TaskStackBuilder addParentStack () не работает Kotlin: Оператор '==' не может применяться к 'kotlin.Int' и 'Person?' ошибка Google Espresso: удалять данные пользователя по каждому тесту Как передать параметр типа в ссылку на общий конструктор класса? Код привязки для Android Studio 3.0, не созданный студией Android Подождите, пока два наблюдаемых испускают истину Упрощение добавления и замены фрагментов в Котлине