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() 
  • java.lang.IllegalArgumentException: Callable espera 4 arguments, pero se proporcionaron 3
  • Interoperabilidad de reflexión de Kotlin con Java
  • Kotlin enlazó la incoinheritance de las references invocables
  • Implementando una interfaz de kotlin en java
  • Kotlin, cómo recuperar el valor del campo a través de la reflexión
  • ¿Puedo get una KFunction de una variable del tipo de function en Kotlin?
  • Configurar la reflexión de kotlin, class.java no funciona
  • La igualdad de class Kotlin falla
  • Usar reflexión para pasar y modificar una primitiva sin usar matriz
  • Crear una nueva instancia de una KClass
  • ¿Cómo cambiar un campo de miembro con la reflexión de Kotlin?