generics - 在没有 reified 关键字的 Kotlin 中获取泛型类型参数的运行时类
问题描述
Kotlin 提供了一种使用关键字获取泛型类型参数的运行时类的方法,该reified
关键字只能与inline
函数一起使用。例如以下作品:
inline fun <reified T> test() : T {
println(T::class.java)
}
但是,我需要一种在非内联函数中执行此操作的方法。由于reified
关键字不是非内联函数的选项,因此以下内容不起作用:
fun <reified T> test() : T {
println(T::class.java)
}
Kotlin 是否有不同的方法来解决这个问题?我知道将 theClass<T>
作为参数可能是一种解决方案,但我不想为此目的向我的函数传递额外的参数。
解决方案
一个有点棘手的解决方案:
inline fun <reified T> test() : T = testImpl(T::class.java)
private fun <T> testImpl(`class`: Class<T>) : T {
println(`class`)
// do something
}
在此解决方案中,您实际上是在传递一个Class
实例,但不是直接进行。您的调用代码可能看起来像test<Xxx>()
.
如果T
oftest
可以推断出来,就可以test()
直接使用了,泛型参数还是正确传递的。
推荐阅读
- python - 为什么 NumPy 支持 np.float16 但不支持 np.complex32?
- python - 使 dict 绑定 TypeVar 接受 TypedDict
- django - django.db.utils.IntegrityError:从以前的服务器上传 psql 备份时重复键值违反唯一约束错误
- hadoop - 有没有其他方法可以使这个(--incremental lastmodified)与--hive-imports一起工作
- xcode - 在我的 react-native 应用程序(iOS 和 Android)中的应用程序中添加自定义字体和图像的最佳做法是什么
- c - 每当我尝试将 unsigned char* 转换为 X509* 时出现分段错误
- javascript - 如何为下载 JSON 文件设置自定义路径?
- camera - 将 setPreferredSize 从基数 0 更改为
- facebook - 如何在 facebook market api 中获取永久用户令牌?
- c# - System.Threading.Tasks.TaskCanceledException: '操作被取消。' 我的 byte[] 发送时间太长