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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 09:35:19