我知道如何在Kotlin中反映和迭代单个对象的属性,以查找特定类型的所有属性:

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

fun main(){
    // filter out the integer property, keep the string property
    Obj1::class
        .declaredMemberProperties
        .mapNotNull { it.get(Obj1) as? String }
        .forEach { println(it) }  // prints "one", does not print "1"
}

但当我有一个通用对象列表时,我很难让它工作:

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.get(obj) as? String } // compiler error
            .forEach { println(it) }

    }
}

it.get(obj)有错误:Type mismatch: inferred type is Any but Nothing was expected

我该怎么做?

推荐答案

发生这种情况是因为编译器不明白您从与您获取属性的对象完全相同的对象获得属性值.它不会跟踪您在两个地方都使用了obj.因此,它不允许此操作,因为它不确定obj是否具有所需的属性.

据我们所知,obj保证拥有该属性,并且代码是安全的,我们可以铸造该属性.这将是一个未经判断的演员阵容:

@Suppress("UNCHECKED_CAST")
(it as KProperty1<Any, *>).get(obj) as? String

您的第一个示例有所不同,因为您从非常特定的类型Obj1获取了属性,并且编译器可以验证您然后使用相同的Obj1来获取值.

Kotlin相关问答推荐

在KMP中使用koin将来自Android的上下文注入到SQLDelight Driver中

Jetpack Compose中的数字 Select 器问题

Kotlin多平台(KMP)保存到文件不能在iOS上保存

如何创建一个空的kotlin工作?

kotlin - 挂起简单方法调用链时可能存在冗余分支

在 Kotlin 中将 Array 转换为 IntArray 时丢失值

为什么Kotlin有次构造函数和init块?

如何获取@JsonProperty 名称列表?

mutableStateOf 和 mutableStateListOf 有什么区别?

在 Kotlin 中,为什么在 `+` 之前但在 `.` 之前没有换行符?

测试协程和线程之间的差异,我在kotlin中使用线程时无法得到OOM错误

如何连接两个 kotlin 流?

Kotlin 可打包类抛出 ClassNotFoundException

为什么我在使用 Jetpack Compose clickable-Modifier 时收到后端内部错误:Exception during IR lowering error?

有没有办法在spring webflux和spring data react中实现分页

如何在 Kotlin 中判断数组类型(不是泛型类型)

Kotlin:什么是 kotlin.String!类型

无法在Kotlin中使用argb color int值?

Kotlin reflect proguard SmallSortedMap

类型不匹配推断类型为单位,但应为空