【发布时间】:2019-07-26 06:48:50
【问题描述】:
有人可以帮我了解一下 Kotlin 编译器的行为吗?
该程序的目的是将输入字符串转换为相应的类型(BMsg 或CMsg)
并在控制台中打印结果。
但是,我从编译器收到以下消息:
"类型推断失败。没有足够的信息来推断参数T ……”
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
abstract class classA<T> {
fun handle(body: String) {
val result = convertToSpecificMessageType(body) // This line fails
printResult(result)
otherImportantStuff()
}
abstract fun otherImportantStuff()
private inline fun <reified T : Any> String.toPayloadObject(): T =
jacksonObjectMapper().readValue(this, T::class.java)
private inline fun <reified T : Any> convertToSpecificMessageType(body: String): T = body.toPayloadObject()
private fun printResult(result: T) = println("result = $result")
}
class classB : classA<BMsg>() {
override fun otherImportantStuff() = print("important stuff of class B")
}
class classC : classA<CMsg>() {
override fun otherImportantStuff() = print("important stuff of class C")
}
sealed class Msg
data class BMsg(val x: String) : Msg()
data class CMsg(val y: Int) : Msg()
fun main() {
classB().handle("{\"x\" : \"aaa\"}")
classC().handle("{\"y\" : 5}")
}
尽管我找到了解决方法 - 将 convertToSpecificMessageType 方法声明为 abstract
并覆盖classB/classC,我想知道(1)是什么原因使编译器抱怨
(2) 是否有办法在不覆盖convertToSpecificMessageType 的情况下解决问题?
提前谢谢!
P.S. kotlin 版本 = '1.3.21'
【问题讨论】:
标签: oop generics kotlin type-inference