扩展函数内的 Kotlin KClass 实例

Kotlin KClass instance inside extension function

我需要在通用扩展函数中访问 class 类型。例如,如果我想对 return 我正在扩展的类型的成员集合进行扩展函数,我会这样做:

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

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

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

得到 class

T 引用一个类型,所以通常你会用 T::class.

引用 KClass

但是,在您的特定代码片段中,如果不进行一些额外的更改,这些都不会起作用。

由于通用类型 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