为什么这段实现indexOfMax的Kotlin代码会出现类型不匹配?
为什么这段Kotlin代码会出现类型不匹配?
咱们来一步步拆解这个问题哈:
首先,问题出在a.max()的返回值类型和a.indexOf()的参数类型不兼容上:
- Kotlin中
IntArray的max()方法返回的是Int?(可空整数类型)。哪怕你已经通过a.isNotEmpty()判断了数组非空,编译器也不会自动把maxValue的类型从Int?转换为Int——这是Kotlin严格的空安全机制导致的,它还是会认为maxValue存在为null的可能性。 - 而
a.indexOf()方法要求传入的参数是Int(非空整数类型),你把一个Int?类型的变量传进去,自然就触发了类型不匹配的错误。
怎么修复这个问题?
有两种常见的修复思路:
思路1:强制断言非空(安全场景下)
因为已经通过a.isNotEmpty()确保了数组里有元素,max()肯定不会返回null,所以可以用!!强制把Int?转为Int:
package maxindex import kotlin.collections.* fun indexOfMax(a: IntArray): Int? { if (a.isNotEmpty()) { var maxValue = a.max()!! // 这里加!!断言非空 return a.indexOf(maxValue) } else { return null } }
思路2:优化逻辑,避免两次遍历(更高效)
原代码先调用max()遍历一次数组找最大值,再调用indexOf()遍历一次找索引,其实可以只遍历一次数组就找到最大值的索引,同时也避开空类型的问题:
package maxindex fun indexOfMax(a: IntArray): Int? { if (a.isEmpty()) return null var maxIndex = 0 for (i in 1 until a.size) { if (a[i] > a[maxIndex]) { maxIndex = i } } return maxIndex }
内容的提问来源于stack exchange,提问作者adam autuori
相关产品推荐
相关产品推荐

