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
相关产品推荐
相关产品推荐

