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

