扩展功能内的Kotlin KClass实例

Víc*_*cia 3 generics kotlin extension-function

我需要访问通用扩展函数中的类类型。例如,如果我想做一个扩展函数以返回我正在扩展的类型的成员的集合,我会这样做:

fun <T> T.getMembers() =
       this::class.memberProperties
Run Code Online (Sandbox Code Playgroud)

问题是我不能在函数内部执行this :: class或T :: class。有什么方法可以访问泛型类型的类类型?

Jos*_*sen 5

通常,您不会使用::从获取类this,因为它this引用的是实例,而不是类型。一般来说,你会从获取类thisthis.javaClass.kotlin

T引用类型,因此通常您可以使用来引用KClass T::class

但是,在您的特定代码段中,没有任何其他更改,这些都不起作用。

由于通用类型T不受限于Any,因此您无法访问javaClass字段。要添加约束,请使用:

fun <T : Any> T.getMembers() =
   this::class.memberProperties
Run Code Online (Sandbox Code Playgroud)

由于通用类型未定义,因此您不能使用T::class。要验证T,请使用:

inline fun <reified T : Any> T.getMembers() =
   T::class.memberProperties
Run Code Online (Sandbox Code Playgroud)

参见https://kotlinlang.org/docs/reference/inline-functions.html#reified-type-parameters