2017-03-28 4 views
6

私のクラスのプロパティの値を出力したいと思います。私はクラス名にthisを変更するとSomeClass :: classはKClass <SomeClass>ですが、このクラスはKClassです。<out SomeClass>

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' 

SomeClassすべてがうまくある

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

だから問題はそのコンパイラです:私はこのコードを構築しようとした際

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

私は、コンパイラのエラーを取得しますKClass<SomeClass>の代わりにthis::classKClass<out SomeClass>のチェンジャータイプを使用してください。それはどうして起こりますか?

答えて

7

この違いの理由は、あなたがSomeClass::class参照を使用する場合、ので、それが型投影なしKClass<SomeClass>で、SomeClassなくその可能派生クラスのいずれかを表すクラストークンになるはずである、ということです。 open又はabstractクラス又は拡張機能の機能に書き込ま

しかしthis::classは、型の安全性を確保するために、従って、派生クラスのクラストークンを返すことができ、type is out-projectedKClass<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() 
+0

は、ご返信いただきありがとうございます。それは非常に有用です。 –

関連する問題