por qué SomeClass :: class es KClass <SomeClass> pero esta :: class es KClass <out SomeClass>

Quiero imprimir valores de properties de mi class.

fun print() { val cl = this::class cl.declanetworkingMemberProperties.filter {it.visibility != KVisibility.PRIVATE}.forEach { println("${it.name} = ${it.get(this)}") } } 

Cuando bash build este código, obtengo un error de compilation:

 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' 

Cuando cambio this al nombre de class SomeClass todo está bien

 fun print() { val cl = SomeClass::class cl.declanetworkingMemberProperties.filter {it.visibility != KVisibility.PRIVATE}.forEach { println("${it.name} = ${it.get(this)}") } } 

Entonces, el problema es que los comstackdores cambian el tipo de this::class a KClass<out SomeClass> lugar de usar KClass<SomeClass> . ¿Alguna idea de por qué sucede?

El motivo de esta diferencia es que, cuando utiliza la reference de SomeClass::class , seguramente será el token de class que representa SomeClass y no una de sus posibles classs derivadas, por lo tanto, es KClass<SomeClass> sin proyecciones de tipo.

Pero this::class escrita en function de una class open o abstract o una function de extensión puede devolver un token de class de una class derivada, por lo tanto, para garantizar la security del tipo , el tipo está out : KClass<out SomeClass> significa que el argumento de tipo real puede ser SomeClass o su subtipo.

Ejemplo:

 open class A { fun f() { println(this::class) // KClass<out A> because it can be KClass<B> } } class B : A() B().f() 
  • Kotlin invoke getter / setter reflexivamente
  • Kotlin: ¿Es aquí una forma inteligente de lanzar NotImplementedError para todos los methods de una class?
  • ¿Cómo establecer el valor de propiedad delegada por reflexión en kotlin?
  • La igualdad de class Kotlin falla
  • ¿Hay alguna manera de identificar una class de datos Kotlin de una class regular de Kotlin?
  • String.intern () devuelve diferentes valores en un controller JDBC
  • Usar reflexión para pasar y modificar una primitiva sin usar matriz
  • ¿Cómo obtengo una KProperty1 de una KProperty0?
  • ¿Cómo obtengo el valor de una propiedad con reflection?
  • Kotlin: ¿Cómo se accede a los methods get y setValue de un delegado?
  • instancia :: class.java vs. instance.javaClass