2017-02-03 95 views
2

我需要訪問通用擴展函數中的類類型。例如,如果我想打一個擴展函數返回我擴展類型的成員的集合,我會做:Kotlin KClass實例內部擴展函數

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

的問題是,我不能這樣做::類,也不T: :函數內部的類。有沒有辦法訪問泛型類的類類型?

回答

2

一般而言,您不會使用::this獲取類,因爲this引用了實例,而不是類型。通常你會從thisthis.javaClass.kotlin

類參考類型,所以通常你會引用KClass T::class

但是,在您的特定代碼片段中,這些都不會沒有一些額外的更改。

由於通用類型T不限於Any,因此無法訪問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

讓'T'成爲'Any'的孩子解決了我(幾乎完全無關)的問題 - 謝謝! – forresthopkinsa