我想用下面的代码反序列化一个json到Map对象Map器:
fun onMessage(topic: String, message: MqttMessage) {
val typeRef = object : TypeReference<HashMap<String, String>>() {}
val msg = objectMapper.readValue(message.payload, typeRef)
...
}
编译器表示无法推断fun <T : Any!> readValue (src: ByteArray!, valueTypeRef: (TypeReference<Any!>..TypeReference<*>?)): T!
中的参数T
如果不使用我的自定义类扩展HashMap,是否有解决此问题的方法:
class MyHashMap : HashMap<String, String>()
...
fun onMessage(topic: String, message: MqttMessage) {
val msg = objectMapper.readValue(message.payload, MyHashMap::class.java)
...
}
3条答案
按热度按时间3htmauhk1#
实际上,问题出在Jackson的API中。下面是
readValue
方法的声明方式:由于某种原因,它们使用了
TypeReference
的原始类型,即使它们可以很容易地将TypeReference<T>
作为参数。如果它们这样做了,您的代码将按原样工作,因为Kotlin可以推断函数的T
泛型类型参数,从而知道其返回类型。但是,您可以通过显式地使用类型来解决此问题。
msg
变数的型别:thtygnil2#
一种可能的方式是:
b91juud33#
您可以使用对象运算式来传递
TypeReference
的匿名实作:请注意
TypeReference
参数之前的object:
保留字。