Может кто-нибудь помочь мне разобраться с поведением компилятора 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
?Заранее спасибо!
PS kotlin version = '1.3.21'