kotlin:列出任何对象的属性 - 方差错误

kotlin: list properties of any object - variance error

我正在尝试编写一个函数来生成任何类型的属性和值映射

inline fun <reified T : Any> T.propertiesMap() {
    for (property in this::class.memberProperties) {
        property.get(this)
    }
}

我在 property.get(this) 中遇到关于

的编译错误

out-projected type [...] prohibits the use of 'public abstract fun get(receiver...

如果您使用要具体化的类型而不是该类型的实例,则差异问题就会消失。当您调用 T::class.memberProperties 时,您会得到一个 Collection<KProperty<T, *>> ,这就是我相信您想要的。另一方面,如果你在一个实例 (this) 而不是一个类型上调用它,你会得到一个 Collection<KProperty<out T, Any?>>,这就是你的 out-variance 问题的来源。

inline fun <reified T : Any> T.propertiesMap() {
    for (property in T::class.memberProperties) {
        property.get(this)
    }
}

本质上,您需要执行 T::class 而不是 this::class 才能取回正确类型的集合。我已经离开了你的代码 as-is 否则因为我不清楚你想要这个函数做什么,但我怀疑你可以放弃 for 循环以支持 map 调用。

问题是 this::class 生成 KClass<out T> 而不是 KClass<T>,这是在 [=16= 中使用任何 T 类型所需要的] 称呼。所以你可以做一个未经检查的演员来做你想做的事:

fun <T : Any> T.propertiesMap() {
    @Suppress("UNCHECKED_CAST")
    for (property in (this::class as KClass<T>).memberProperties) {
        property.get(this)
    }
}

不要求函数内联也不具体化类型参数。否则,您可以更改函数以使用 T::class 而不是 this::class 来创建匹配的 KClass<T>.

inline fun <reified T : Any> T.propertiesMap() {
    for (property in T::class.memberProperties) {
        property.get(this)
    }
}