generics - 如果您只有一个 KClass 对象,那么用具体的类型参数调用一个有趣的东西?
问题描述
只能将具体类型参数与内联函数一起使用。因此,如果我想要一个类的这样一个参数,我需要这样的技巧:
class Foo<T : Any>(private val clazz: KClass<T>) {
companion object {
inline fun <reified T: Any> create() = Foo(T::class)
}
}
然后我可以创建这样的实例Foo
:
val foo = Foo.create<Bar>()
在Foo
我可以访问的范围内,clazz
但我的问题是,当我需要调用需要具体类型参数的方法时,我可以使用clazz
吗?
例如,Foo
我想添加一个这样的方法:
fun print(list: List<Alpha>) {
list.filterIsInstance<T>().forEach { print(it) }
}
但据我所见,没有办法得到clazz
我可以在这里用作类型参数的东西。
是的,我知道有一种形式filterIsInstance
需要 aClass
所以我可以这样做:
list.filterIsInstance(clazz.java).forEach { print(it) }
然而,许多库包含的方法都没有提供两种形式(显式类参数和具体类型参数)。
例如 Jackson Kotlin Extensions.kt。实际上,这不是一个很好的例子,因为未具体化的等价物都是单行的,但情况并非总是如此 - 然后您最终将具体化类型参数方法的实现解压缩到您的代码中。
解决方案
不,因为这些函数是inline
,它们在编译时内联,并且 Class 或 KClass 在运行时使用反射
你可以做一些技巧..就像伴随类一样,但这根本不需要KClass<T>
..任何其他提供通用参数的东西都T
适用于reified
类型信息
PS:反射也不能可靠地帮助你,因为内联函数在运行时并不真正存在,正如它们的修饰符所解释的那样inline
推荐阅读
- amazon-web-services - SageMaker 更新端点挂起并失败
- android-studio - 未找到适用于 Android 检测单元测试的测试
- angular - 在 RxJS 中处理错误的正确方法是什么?
- c - gcc-11 不正确可能会在未初始化的情况下使用,这似乎很难避免
- spring-integration - 如何将 WatchServiceDirectoryScanner 与 Spring Cloud Stream 文件供应商一起使用?
- jbpm - 恢复 JBPM 7.48 WorkDefinitions wid 文件以检索里程碑图标
- javascript - 在 Angular 中使用 pdfMake.js 合并多个 pdf
- mariadb - 在日期范围内或基于另一列的值强制唯一性
- python - 在字符''''(位置 1)没有可行的替代方案
- solr - Solr 8.10 示例核心文件以及如何添加新核心