почему SomeClass :: class – это KClass <SomeClass>, но this :: class – это KClass <out SomeClass>

Я хочу напечатать значения свойств моего класса.

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

Когда я пытаюсь построить этот код, я получаю ошибку компилятора:

 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' 

Когда я изменяю this на имя класса SomeClass все в порядке

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

Таким образом, проблема заключается в том, что компилятор меняет тип this::class на KClass<out SomeClass> вместо использования KClass<SomeClass> . Любая идея, почему это происходит?

Причиной этого различия является то, что при использовании SomeClass::class на SomeClass::class обязательно будет токеном класса, представляющим SomeClass а не одним из его возможных производных классов, поэтому это KClass<SomeClass> без прогнозов типов.

Но this::class написанный в функции open или abstract класса или функции расширения, может возвращать маркер класса производного класса, поэтому для обеспечения безопасности типа тип out KClass<out SomeClass> : 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() 
Intereting Posts
Котлин: назначается «это»? Kotlin: Как получить доступ к свойствам в конструкторе Вызвано: android.database.sqlite.SQLiteException: рядом с «org»: синтаксическая ошибка (код 1): при компиляции: Можно ли смешивать Ktor с Exposed? Почему AtomicInteger является абстрактным в Котлине? (он отлично работает на Java) Преобразование карт в список карт в Котлине Android: запустите 4 async-задачи (которые работают с Rest API), подождите и начните еще одно действие после выполнения всех задач Захват и сохранение изображения с помощью Kotlin в Android Studio Метод anko toast () вызывает java.lang.NoSuchMethodError при вызове из фрагмента android -kotlin -java.lang.ClassCastException Spring Data JPA Как использовать ноль Kotlin вместо необязательного Обработчик комментариев Kotlin: он не может заставить его работать Как объявить функцию в качестве переменной в Kotlin Kotlin: получить ссылку на функцию экземпляра класса Почему URL ("http://pboss.pozit.pl/contact.html") .readText () делает сбой приложения для Android?