我是一个新的Kotlin程序员,我遇到了一个有关泛型的问题。
在下面的代码中,我收到了一个与it.get(this)
“类型不匹配”有关的错误。所需:无。找到:任意。
inline fun <reified T : Any> Any.getPropertiesWithType() =
this::class.memberProperties
.filter { it.returnType.isSubtypeOf(T::class.starProjectedType) }
.map {
it.isAccessible = true
it.get(this) as T
}
这是令人困惑的,因为memberProperties
返回一个Collection<KProperty1<T, *>>
,其中T是this
的类型,在我的例子中是Any
。KProperty1.get()
有一个相同类型的参数T,所以我希望Any
可以在没有问题的情况下被传递。
我注意到的一件事是,过滤器和map中的it
都是KProperty<out Any, *>>
类型,但是memberProperties
没有输出方差。
如果我将this::class
替换为this.javaClass.kotlin
,它可以正常工作,但这似乎是一种非常糟糕的方法。
如果有人知道解决这个问题的方法,或者一个完全不同的策略,我们将不胜感激。我对Kotlin很陌生,有时还是用Java的方式做事。
发布于 2022-02-17 18:23:26
this::class
类似于Java中的this.getClass()
,后者返回KClass<out Any>
(Java中的Class<? extends Object>
)。毕竟,仅仅因为this
的类型是Any
,它的运行时类型可能不是Any
--它可以是Any
的任何子类。out Any
抓住了这个想法。
因此,memberProperties
of this::class
将是KProperty1<out Any, *>
的集合。
同样,您不能使用MutableList<out Any>
向add
添加任何内容,也不能get
KProperty1<out Any, *>
的值--输入参数的类型被标记为out
。考虑这一点的另一种方法是,该属性可能位于Any
的任何子类上,试图使用this
(它只是一个Any
)获取属性,显然不起作用。
我会将未检查的强制转换移到it
(it as KProperty1<Any, T>).get(this)
至于为什么.javaClass
工作,这是因为javaClass
实际上给了您一个Class<Any>
,而不是Class<out Any>
。海事组织,这没什么意义,但事实就是如此。
https://stackoverflow.com/questions/71163184
复制相似问题