Kotlin KClass实例内部扩展功能

时间:2017-02-03 23:13:13

标签: generics kotlin extension-function

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

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

问题是我不能在函数内部执行:: class和T :: class。有没有办法访问泛型类的类类型?

1 个答案:

答案 0 :(得分:4)

通常,您不会使用::this获取类,因为this引用的是实例,而不是类型。通常,您可以使用this

this.javaClass.kotlin获取课程

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