Gson выдает ошибку при использовании hashmap

#java #hashmap #gson #classcastexception #bukkit

#java #hashmap #gson #classcastexception #bukkit

Вопрос:

Я пытаюсь поместить 2 целых значения [] в HashMap, однако библиотека gson, которая у меня есть в моих зависимостях maven, задействована, и я не могу понять, почему…

В приведенном ниже коде «x» и «z» являются целыми числами, которые поступают из метода из используемого мной API, которые определенно возвращают целые числа и передаются через параметры в методе и утверждениях.connectionMap является общедоступным и статическим в основном классе.

 Integer[] set = {x, z};
Claims.connectionMap.put(set, set); // LINE 110
 

И это connectionMap:

 public static Map<Integer[], Integer[]> connectionMap = new HashMap<>();
 

Эта hashmap экспортируется и импортируется при каждом запуске и остановке сервера, но, кроме этого, я не могу до конца понять, почему gson будет что-то делать с этим кодом, сообщение на форуме, которое я прочитал где-то еще, указывает на то, что это потенциально ошибка времени сборки, но она импортируется в код простохорошо (насколько я могу судить): это код для импорта

 Map<Integer[], Integer[]> map;
// a few lines later
map = gson.fromJson(new String(array), Map.class);
 

Но, к сожалению, эта ошибка возникает в строке 110 первого примера кода

 31.01 10:19:23 [Server] INFO Caused by: java.lang.ClassCastException: [Ljava.lang.Integer; is not Comparable
31.01 10:19:23 [Server] INFO at com.google.gson.internal.LinkedTreeMap.find(LinkedTreeMap.java:164) ~[patched_1.16.4.jar:git-Paper-416]
31.01 10:19:23 [Server] INFO at com.google.gson.internal.LinkedTreeMap.put(LinkedTreeMap.java:94) ~[patched_1.16.4.jar:git-Paper-416]
31.01 10:19:23 [Server] INFO at com.eejay.towny.Towny.addConnection(Towny.java:110)
 

Любая помощь будет принята с благодарностью, большое вам спасибо 🙂

Комментарии:

1. Используйте ArrayList вместо array.

2. У меня все еще была та же проблема с этим, мне удалось решить ее, как рекомендовано для использования строк 🙂

Ответ №1:

Gson десериализуется Map<Integer[], Integer[]> map , используя свою собственную LinkedTreeMap реализацию, которая требует ключей для реализации Comparable интерфейса.

Integer[] является массивом, поэтому он не реализует Comparable интерфейс и не может быть использован в качестве ключа. Я не уверен, почему вы используете массивы в качестве ключей, поскольку JSON обычно использует String ключи.