Котлин: objectmapper.readValue () с TypeReference <HashMap <String, String >> не может вывести параметр - PullRequest
0 голосов
/ 08 сентября 2018

Я бы хотел десериализовать json в Map с помощью objectmapper со следующим кодом:

fun onMessage(topic: String, message: MqttMessage) {
   val typeRef = object : TypeReference<HashMap<String, String>>() {}
   val msg = objectMapper.readValue(message.payload, typeRef)
   ...
}

Компилятор говорит, что не выводит параметр T в fun <T : Any!> readValue (src: ByteArray!, valueTypeRef: (TypeReference<Any!>..TypeReference<*>?)): T!

Есть ли какое-нибудь решение этой проблемы, не расширяющее HashMap с помощью моего пользовательского класса, например:

class MyHashMap : HashMap<String, String>()

...

fun onMessage(topic: String, message: MqttMessage) {
   val msg = objectMapper.readValue(message.payload, MyHashMap::class.java)
   ...
}

1 Ответ

0 голосов
/ 08 сентября 2018

Проблема, действительно, в API Джексона здесь. Вот как объявляется метод readValue:

public <T> T readValue(String content, TypeReference valueTypeRef)

По какой-то причине они используют необработанный тип TypeReference, хотя они могут легко принять TypeReference<T> в качестве параметра. Если бы они это сделали, ваш код работал бы как есть, поскольку Kotlin мог бы затем определить параметр универсального типа T функции и, следовательно, узнать его тип возврата.

Однако вы можете обойти эту проблему несколькими способами, явно указав свои типы.

  • Либо, указав параметр универсального типа для функции и указав тип переменной msg:

    val msg = objectMapper.readValue<HashMap<String, String>>(message.payload, typeRef)
    
  • Или, альтернативно, явно введя вашу переменную и указав параметр типа функции:

    val msg: HashMap<String, String> = objectMapper.readValue(message.payload, typeRef)
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...