首页 > 解决方案 > 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和其他构造也没有产生任何更好的结果。

标签: kotlin

解决方案


发生这种情况是因为它无法智能投射StringT,您必须手动投射它。

此外,既然您说您正在 Kotlin 中迈出第一步,我在这里留下两个与您的问题不严格相关的“建议”:

  1. 你可以参加T制作它的课程reified
  2. 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
}


推荐阅读