扩展函数内的 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
引用实例,而不是类型。通常你会从 this
和 this.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
我需要在通用扩展函数中访问 class 类型。例如,如果我想对 return 我正在扩展的类型的成员集合进行扩展函数,我会这样做:
fun <T> T.getMembers() =
this::class.memberProperties
问题是我无法在函数内部执行 this::class 或 T::class。有什么方法可以访问泛型的 class 类型吗?
通常,您不会使用 ::
从 this
获取 class,因为 this
引用实例,而不是类型。通常你会从 this
和 this.javaClass.kotlin
T 引用一个类型,所以通常你会用 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