2017-02-03 9 views
2

汎用拡張関数内でクラス型にアクセスする必要があります。例えば、私は拡張していたタイプのメンバーのコレクションを返すために、拡張機能を作成したい場合、私はどうなる:拡張機能内のKotlin KClassインスタンス

fun <T> T.getMembers() = 
     this::class.memberProperties 

問題は、私はこの::クラスにもTを行うことができないということです。 :関数内のクラス。ジェネリック型のクラス型にアクセスする方法はありますか?

答えて

2

thisは、タイプではなくインスタンスを参照するため、一般的には、thisからクラスを取得するために::を使用しません。一般的に、thisからthis.javaClass.kotlin

Tを参照すると、一般的にT::classのKClassを参照するクラスが得られます。

ただし、お客様の特定のコードスニペットでは、これらのどちらも変更を加えなくても機能しません。

TAnyに制限されていないため、javaClassフィールドにアクセスすることはできません。制約を追加するには、使用:ジェネリック型を具体化されていない

fun <T : Any> T.getMembers() = 
    this::class.memberProperties 

ので、あなたはT::classを使用することはできません。 Tを具体化するには、使用:

inline fun <reified T : Any> T.getMembers() = 
    T::class.memberProperties 

はあなたが非常にhttps://kotlinlang.org/docs/reference/inline-functions.html#reified-type-parameters

+0

感謝を参照してください!! –

+0

あなたは大歓迎です:) –

+0

'Any'の' T'子が私の(ほとんど無関係な)問題を解決しました - ありがとう! – forresthopkinsa