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

如何在Kotlin中对多个对象反射以查找特定类型属性

解决Kotlin泛型对象列表反射遍历属性的编译错误

错误原因

当用listOf(Obj1, Obj2)创建列表时,元素类型被推断为Any。而declaredMemberProperties返回的是对应对象实际类型的KProperty1<T, *>集合,调用it.get(obj)时,编译器无法确认obj(类型为Any)和属性要求的接收者类型匹配,因此抛出Type mismatch: inferred type is Any but Nothing was expected错误。

解决方案

这里提供两种可行的修复方式:

方法1:强制转换属性类型

将属性强制转换为KProperty1<Any, *>,明确告诉编译器obj是合法的接收者:

object Obj1{
    val obj1Int = 1
    val obj1String = "one"
}

object Obj2{
    val obj2Int = 2
    val obj2String = "two"
}

fun main() {
    listOf(Obj1, Obj2).forEach { obj ->
        obj::class.declaredMemberProperties
            .map { it as KProperty1<Any, *> }
            .mapNotNull { it.get(obj) as? String }
            .forEach { println(it) }
    }
}

方法2:使用call方法替代get

KProperty继承自KCallable,其call方法接受Any?类型的接收者,更适配泛型场景:

object Obj1{
    val obj1Int = 1
    val obj1String = "one"
}

object Obj2{
    val obj2Int = 2
    val obj2String = "two"
}

fun main() {
    listOf(Obj1, Obj2).forEach { obj ->
        obj::class.declaredMemberProperties
            .mapNotNull { it.call(obj) as? String }
            .forEach { println(it) }
    }
}

两种方法都能正常输出one和two,你可以根据场景选择更合适的方式。

内容的提问来源于stack exchange,提问作者J-bob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 16:37:34