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)
}
}
我正在尝试编写一个函数来生成任何类型的属性和值映射
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)
}
}