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

Kotlin类类型判断is不生效?传入类列表调用函数仅返回id是何原因

问题原因

1. 传入参数和判断逻辑不匹配

你传入updatedFields的列表是listOf(IncomeVerificationType::class, IncomeType::class),列表里存储的是KClass元数据对象(对应类的类型本身),不是IncomeVerificationType、IncomeType的实例。而你的is判断是校验元素是否为这两个类的实例,自然全部匹配失败。

2. 不可变Map操作逻辑错误

Kotlin中默认的mapOf生成的是不可变Map,plus()方法不会修改原Map,只会返回一个包含新键值对的新Map。你在循环中调用plus()后没有接收返回值,原Map始终只有初始化的id键。同时你用val声明的变量也不能重新赋值,就算接收返回值也会报错。


修复方案

如果你的业务逻辑就是通过传入类类型来指定要返回的字段,可以按照下面的方式修改代码:

// 首先把参数类型改为接收KClass列表
fun sendUpdatedEvent(model: Model, updatedFields: List<KClass<*>>): Map<String, Any> {
    // 使用可变Map存储键值对
    val fieldToValueMap = mutableMapOf("id" to model.identity.id)
    updatedFields.forEach {
        when (it) {
            // 直接匹配KClass对象即可
            IncomeVerificationType::class -> fieldToValueMap["incomeVerification"] = model.incomeVerification
            IncomeType::class -> fieldToValueMap["incomeTypeId"] = model.incomeTypeId
        }
    }
    return fieldToValueMap
}

调用方式和你之前的写法保持一致即可:listOf(IncomeVerificationType::class, IncomeType::class)

如果使用Kotlin 1.3及以上版本,还可以用buildMap简化写法,不用手动声明可变Map:

fun sendUpdatedEvent(model: Model, updatedFields: List<KClass<*>>): Map<String, Any> = buildMap {
    put("id", model.identity.id)
    updatedFields.forEach {
        when (it) {
            IncomeVerificationType::class -> put("incomeVerification", model.incomeVerification)
            IncomeType::class -> put("incomeTypeId", model.incomeTypeId)
        }
    }
}

如果你本来的需求是传入类的实例做判断,只需要把调用时的::class去掉,同时把上述代码里的when判断换回is类型校验即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 19:54:04