kotlin - Kotlin:通用转换函数参数
问题描述
在 Kotlin 中迈出第一步时,我正在努力为一个函数找到正确的签名,该函数接收已知类的实例以及所需的输出类,然后查看转换器 lambda 的映射是否可以完成转换。
这是一个示例Long
:
private fun <T> castLong(value: Long, clazz: Class<out T>): T {
// map lookup removed for simplicity
return when (clazz) {
String::class.java -> { value.toString() }
else -> { throw IllegalArgumentException("Unsupported Cast") }
}
}
T
所需返回值的类在哪里- 比方说String
。应该能够调用castLong(aLongValue, String::class.java)
和接收String
. 但是编译器说:
类型不匹配:推断类型为 String 但应为 T
这似乎应该是可能的,因为到目前为止它非常简单,但即使使用reified
和其他构造也没有产生任何更好的结果。
解决方案
发生这种情况是因为它无法智能投射String
到T
,您必须手动投射它。
此外,既然您说您正在 Kotlin 中迈出第一步,我在这里留下两个与您的问题不严格相关的“建议”:
- 你可以参加
T
制作它的课程reified
when
如果案例是一行,则不需要使用案例的括号
private inline fun <reified T> castLong(value: Long): T {
// map lookup removed for simplicity
return when (T::class.java) {
String::class.java -> value.toString()
else -> throw IllegalArgumentException("Unsupported Cast")
} as T
}
推荐阅读
- video - 通过 Twitter API 自定义视频缩略图?
- c - 寻找进程的集合点(struct r_debug)结构?
- php - php-ast 在 phpinfo 中可见,但在 php -m 中不可见(尝试安装 phan)
- angular - Ionic 应用程序和 Angular 应用程序之间的共享组件
- json - cy.request 正文中的 JSON
- php - 通过引用取消设置会话不起作用
- python - 虽然循环不能很好地适应时间
- amazon-web-services - ecs.amazonaws.com 和 ecs-tasks.amazonaws.com 有什么区别?
- sapui5 - 如何在没有数据绑定的情况下使用 sapui5 SmartField?
- javascript - 两个javascript参数如何传递“this”