Why SomeClass :: class is KClass <SomeClass>, but this :: class is KClass <out SomeClass>
I want to print the property values of my class.
fun print() {
val cl = this::class
cl.declaredMemberProperties.filter {it.visibility != KVisibility.PRIVATE}.forEach {
println("${it.name} = ${it.get(this)}")
}
}
When I try to create this code, I get a compiler error:
Error:(34, 40) Kotlin: Out-projected type 'KProperty1<out SomeClass, Any?>' prohibits the use of 'public abstract fun get(receiver: T): R defined in kotlin.reflect.KProperty1'
When I change this
to class name SomeClass
, everything is fine
fun print() {
val cl = SomeClass::class
cl.declaredMemberProperties.filter {it.visibility != KVisibility.PRIVATE}.forEach {
println("${it.name} = ${it.get(this)}")
}
}
So the problem is that the type of compiler change from this::class
to KClass<out SomeClass>
instead of using KClass<SomeClass>
. Any idea why this is happening?
+6
1 answer
, SomeClass::class
, SomeClass
, , KClass<SomeClass>
.
this::class
, open
abstract
, , type out
-projected: KClass<out SomeClass>
, SomeClass
.
:
open class A {
fun f() {
println(this::class) // KClass<out A> because it can be KClass<B>
}
}
class B : A()
B().f()
+7