Geo*_*ins 6 generics kotlin kotlin-reified-type-parameters
只能将具体化的类型参数与内联函数一起使用。所以如果我想要一个类的这样的参数,我需要一个这样的技巧:
class Foo<T : Any>(private val clazz: KClass<T>) {
companion object {
inline fun <reified T: Any> create() = Foo(T::class)
}
}
Run Code Online (Sandbox Code Playgroud)
然后我可以创建这样的实例Foo:
val foo = Foo.create<Bar>()
Run Code Online (Sandbox Code Playgroud)
在Foo我可以访问clazz但我的问题是clazz当我需要调用需要具体化类型参数的方法时我可以使用吗?
例如,Foo我想添加一个这样的方法:
fun print(list: List<Alpha>) {
list.filterIsInstance<T>().forEach { print(it) }
}
Run Code Online (Sandbox Code Playgroud)
但据我所知,没有办法从 clazz这里可以用作类型参数的东西。
是的,我知道有一种形式filterIsInstance需要 aClass所以我可以这样做:
list.filterIsInstance(clazz.java).forEach { print(it) }
Run Code Online (Sandbox Code Playgroud)
然而,许多库都包含两种形式(显式类参数和具体化类型参数)的方法 不提供。
例如 Jackson Kotlin Extensions.kt。实际上这不是一个很好的例子,因为非具体化的等价物都是单行的,但情况并非总是如此——然后你最终将具体化类型参数方法的实现解包到你的代码中。
不,因为这些函数是inline在编译时内联的,并且 Class 或 KClass 在运行时使用反射
您可以使用一些技巧.. 就像使用伴生类一样,但这根本不需要KClass<T>.. 任何其他提供通用参数的东西都T适用于reified类型信息
PS:反射也不能可靠地帮助你,因为内联函数在运行时并不真正存在,正如它们的修饰符所解释的那样inline