Kotlin类型不匹配报错(Type mismatch)及多返回值实现求助
问题解决思路与代码修正
先修正当前校验函数的逻辑问题
你的isValidPositions函数目前存在严重逻辑错误:无论输入是否符合校验规则,最终都会返回true,完全起不到校验作用。先把这个问题解决:
fun isValidPositions(p1: Int, p2: Int, pairs: List<Char>): Boolean { return when { // 位置越界 p1 !in 0..9 || p2 !in 0..9 -> { println("Posições inválidas") false } // 两个位置相同 p1 == p2 -> { println("Posições inválidas") false } // 位置已被占用 pairs[p1] != '_' || pairs[p2] != '_' -> { println("Posições inválidas") false } // 所有校验通过 else -> true } }
实现「同时返回Boolean和Int」的需求
Kotlin不允许单个函数直接返回两种不同的原始类型,但可以用Pair或者自定义数据类来包装结果。比如用Int标识不同的错误类型,Boolean表示校验是否通过:
方案1:使用Pair包装结果
// 返回Pair<Boolean, Int>:第一个值表示是否有效,第二个值是错误码 // 错误码定义:0=无错误,1=位置越界,2=位置重复,3=位置已被占用 fun isValidPositions(p1: Int, p2: Int, pairs: List<Char>): Pair<Boolean, Int> { return when { p1 !in 0..9 || p2 !in 0..9 -> { println("Posições inválidas") Pair(false, 1) } p1 == p2 -> { println("Posições inválidas") Pair(false, 2) } pairs[p1] != '_' || pairs[p2] != '_' -> { println("Posições inválidas") Pair(false, 3) } else -> Pair(true, 0) } }
调用示例:
val first = readPosition("primeira") val second = readPosition("segunda") val (isValid, errorCode) = isValidPositions(first, second, places) if (isValid) { places = places.play(first, second, pairs) } else { // 根据错误码做针对性提示 when(errorCode) { 1 -> println("错误:位置必须在0-9之间") 2 -> println("错误:两个位置不能相同") 3 -> println("错误:该位置已经被占用") } }
方案2:自定义数据类(更清晰)
如果觉得Pair不够直观,可以自定义一个数据类来承载结果:
data class ValidationResult( val isValid: Boolean, val errorCode: Int ) fun isValidPositions(p1: Int, p2: Int, pairs: List<Char>): ValidationResult { return when { p1 !in 0..9 || p2 !in 0..9 -> ValidationResult(false, 1) p1 == p2 -> ValidationResult(false, 2) pairs[p1] != '_' || pairs[p2] != '_' -> ValidationResult(false, 3) else -> ValidationResult(true, 0) } }
调用时和Pair类似,只是可读性更强:
val result = isValidPositions(first, second, places) if (result.isValid) { places = places.play(first, second, pairs) } else { // 处理错误 }
解决Type mismatch: inferred type is unit but int is expected报错
这个错误和isValidPositions无关,是因为你的readPosition函数没有返回Int类型的值。检查该函数,确保它最终返回一个Int,比如:
fun readPosition(tip: String): Int { println("Digite a $tip posição:") // 这里可以添加输入合法性校验,比如如果输入不是数字就重新请求输入 return readLine()?.toIntOrNull() ?: 0 }
内容的提问来源于stack exchange,提问作者Salvador Ferreira
相关产品推荐
相关产品推荐

