reflection - why SomeClass::class is KClass<SomeClass> but this::class is KClass<out SomeClass> -


i want print values of properties of class.

fun print() {     val cl = this::class     cl.declaredmemberproperties.filter {it.visibility != kvisibility.private}.foreach {         println("${it.name} = ${it.get(this)}")     } } 

when try build code compiler error:

error:(34, 40) kotlin: out-projected type 'kproperty1<out someclass, any?>' prohibits use of 'public abstract fun get(receiver: t): r defined in kotlin.reflect.kproperty1' 

when change this class name someclass fine

fun print() {     val cl = someclass::class     cl.declaredmemberproperties.filter {it.visibility != kvisibility.private}.foreach {         println("${it.name} = ${it.get(this)}")     } } 

so problem compiler changers type of this::class kclass<out someclass> instead of using kclass<someclass>. idea why happen?

the reason difference that, when use someclass::class reference, sure class token representing someclass , not 1 of possible derived classes, therefore kclass<someclass> without type projections.

but this::class written in function of open or abstract class or extension function can return class token of derived class, therefore, ensure type safety, type out-projected: kclass<out someclass> means actual type argument can someclass or subtype.

example:

open class {     fun f() {         println(this::class) // kclass<out a> because can kclass<b>     } }  class b : a()  b().f() 

Comments

Popular posts from this blog

javascript - Clear button on addentry page doesn't work -

c# - Selenium Authentication Popup preventing driver close or quit -

tensorflow when input_data MNIST_data , zlib.error: Error -3 while decompressing: invalid block type -