Escriba inferencia para types de parameters lambda

Kotlin no comstack este código porque, como el comstackdor dice "Error: Smart Cast a 'Nothing' es imposible, porque 'accumulator' es una expresión compleja"

La function antigua se llama lo que cabría esperar, es decir, quiero devolver el indexOfMax, pero lo que es más importante es entender por qué el "lanzamiento inteligente" no pudo lanzar al accumulator un 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 } } 

editar

sí, ¡la respuesta aceptada funciona! Aquí está la solución:

 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 } } 

El tipo de accumulator aquí se deduce solo del argumento de valor inicial, que es null . Ese null tiene tipo Nothing? . Después de comprobar que el tipo de accumulator es Int , ¿recibe su tipo smartcasted en la intersección de Nothing? e Int , lo que resulta en Nothing .

La solución aquí es especificar explícitamente los parameters del tipo de function o especificar el tipo del argumento:

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