gpt4 book ai didi

reflection - 为什么 SomeClass::class 是 KClass 但 this::class 是 KClass

转载 作者:IT老高 更新时间:2023-10-28 13:44:56 26 4
gpt4 key购买 nike

我想打印我的类(class)的属性值。

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到类(class)名称SomeClass一切都很好

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

所以问题是编译器更改类型为 this::classKClass<out SomeClass>而不是使用KClass<SomeClass> .知道为什么会这样吗?

最佳答案

造成这种差异的原因是,当您使用 SomeClass::class引用,肯定是代表SomeClass的class token而不是它可能的派生类之一,因此它是 KClass<SomeClass>没有类型投影。

但是this::class写在 open 的函数中或 abstract类或扩展函数可以返回派生类的类标记,因此,为确保类型安全,type is 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()

关于reflection - 为什么 SomeClass::class 是 KClass<SomeClass> 但 this::class 是 KClass<out SomeClass>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43069979/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com