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

