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