Generics 扩展函数内的Kotlin KClass实例

Generics 扩展函数内的Kotlin KClass实例,generics,kotlin,extension-function,Generics,Kotlin,Extension Function,我需要访问泛型扩展函数中的类类型。例如,如果我想创建一个扩展函数来返回我正在扩展的类型的成员集合,我将执行以下操作: fun <T> T.getMembers() = this::class.memberProperties fun T.getMembers()= 此::class.memberProperties 问题是我不能在函数中执行this::class或T::class。有没有办法访问泛型类型的类类型?通常,您不会使用:从this获取类,因为this引用的

我需要访问泛型扩展函数中的类类型。例如,如果我想创建一个扩展函数来返回我正在扩展的类型的成员集合,我将执行以下操作:

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

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

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

T引用一个类型,因此通常您会使用
T::class
引用KClass

但是,在您的特定代码段中,如果没有一些额外的更改,这两种方法都不起作用

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

fun T.getMembers()=
此::class.memberProperties
因为泛型类型没有具体化,所以不能使用
T::class
。要具体化T,请使用:

inline fun T.getMembers()=
T::class.memberProperties

非常感谢您!!让
T
成为
Any
的孩子解决了我(几乎完全无关)的问题——谢谢!这将导致警告
接收器参数从未被使用
。你知道如何克服/避免这种情况吗?@Anigif我答案中的第一个代码块不会有这个问题。第二个示例演示了OP如何仍然可以使用::运算符从具体化类型获取类,但实际上,第一个代码块可能是更好的选择。不过,这种行为略有不同。第一个代码块获取实例的运行时类型的成员,而第二个代码块获取接收方的编译时类型的成员(例如变量的声明类型)。
inline fun <reified T : Any> T.getMembers() =
   T::class.memberProperties