You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LeetCode两数之和Kotlin代码报错:智能转换失败与语法错误求助

问题分析与解决

第一个错误的原因

HashMap<Int, Int>的get(key)方法返回类型是Int?(可空整数)——因为当传入的key不存在于Map中时,方法会返回null。而你的a是IntArray,它的元素是不可空的Int类型,直接赋值会触发类型不匹配。

另外,由于h是用var声明的可变变量,编译器无法确保在调用h.get(nums[i])之后,h没有被其他代码修改,所以无法自动将返回的Int?智能转换(smart cast)为非空的Int,这就是报错的核心原因。

第二个错误的原因

你写的var h = HashMap<Int, Int>()?是语法错误:Kotlin的可空类型标记?必须加在类型名称后面,而非实例化表达式后面。比如正确的可空Map声明是var h: HashMap<Int, Int>? = HashMap(),但这个修改完全没必要——你不需要把HashMap本身设为可空,反而会增加额外的空安全处理负担,这也是这个修改无效的原因。

可行的解决方案

根据2Sum的业务逻辑(目标key必然存在于Map中),推荐以下几种处理方式:

方式1:非空断言(!!)

直接用!!强制将Int?转换为非空Int,适合能100%保证key存在的场景:

a[1] = h.get(nums[i])!!

方式2:存入局部val变量

将get的结果存入一个不可变的局部变量,编译器可以对val进行智能转换:

val targetIdx = h.get(nums[i])
a[1] = targetIdx!! // 若逻辑上能保证非空,编译器会自动完成智能转换

方式3:使用getOrDefault(可选)

如果需要处理key不存在的边界情况(2Sum中一般不需要),可以指定默认值:

a[1] = h.getOrDefault(nums[i], -1) // -1为默认值,可根据需求调整

方式4:安全调用+Elvis运算符

如果需要主动抛出异常处理key不存在的情况:

a[1] = h.get(nums[i]) ?: throw IllegalArgumentException("目标key不存在")

内容的提问来源于stack exchange,提问作者Uwastoya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 05:55:18