为什么这个Kotlin代码的类型不匹配?

时间:2018-05-23 20:16:09

标签: kotlin

您的任务是实现indexOfMax()函数,以便它返回 数组中最大元素的索引,如果数组为空,则返回null。

package maxindex

import kotlin.collections.*

fun indexOfMax(a: IntArray): Int? {
    if (a.isNotEmpty()) {
        var maxValue = a.max()
        return a.indexOf(maxValue) // Type mismatch
    } else {
        return null
    }
}

2 个答案:

答案 0 :(得分:1)

我记得当我第一次开始使用Kotlin时,我很困惑,当它说"这个变量是可变的,所以不允许安全铸造"我不知道发生了什么:)

无论如何,由于该语言已输入可为空性,因此您的类型不匹配。因此,您无法可能null提供给indexOf,因为它要求它为非空Int

如果您查看max()的源代码:

public fun IntArray.max(): Int? {
    if (isEmpty()) return null
    ....

所以可以给你null,因此你得到了

val maxValue: Int? = a.max()

您无法提供maxValue作为indexOf的参数,因为它需要Int,而不是Int?

因此,解决方案是明确处理null案例:

return maxValue?.let { a.indexOf(it) } ?: null

但是现在,基于我们所知道的,你可以大大减少这样的代码行:

fun indexOfMax(a: IntArray): Int? = a.max()?.let { a.indexOf(it) }

您以后可以转变为扩展功能:

fun IntArray.indexOfMax(): Int? = max()?.let { indexOf(it) }

祝你在Kotlin旅途中好运。我个人认为Koans非常恼火,我更喜欢将Java代码转换为Kotlin,以了解学习初步语法怪癖的感受。

答案 1 :(得分:1)

当且仅当a.max()为空时,

null才会返回a。因此,在if (a.isNotEmpty())内,它永远不会为空,a.indexOf(maxValue)采用非空Int

所以这段代码没问题,但Kotlin的类型系统无法表达“a.max()永不返回null如果a不为空”并且不跟踪数组空虚它跟踪可空性的方式相同。所以你需要处理maxValue == null案例,即使它实际上不会发生。