Есть ли словарь, который принимает значения различных типов данных?

Мне нужна карта, где значения имеют разные типы, такие как целое число, строка и т. д. Проблема с Java заключается в том, что примитивы здесь не Object, что предполагает, что гибридный словарь может быть невозможен. Я хочу подтвердить это.


person ada    schedule 13.12.2010    source источник
comment
см. также stackoverflow.com/questions/2001755/   -  person Fortega    schedule 13.12.2010
comment
Возможно, вы захотите поделиться своим дизайном для комментариев. По моему опыту, использование различных типов значений на карте часто является признаком менее чем оптимального дизайна.   -  person Christoffer Hammarström    schedule 13.12.2010
comment
Мне нужен дериализатор JSON, который может создавать дерево на основе только сообщения, а не преобразовывать его в заданный целевой класс. Поэтому мне нужен словарь‹String,Object›(словарь или карта, как бы это ни называлось) или List‹Object› в качестве вывода, как говорит Джон Скит, предполагая автоматическую упаковку в Java. Также предполагается, что есть хорошая библиотека сериализации-десериализации JSON, которая делает это. Gson, например, нужен тип, в который будет десериализовано сообщение. Следовательно, Gson мне не помогает. Надеюсь, вы понимаете мою проблему.   -  person ada    schedule 13.12.2010
comment
Можете ли вы опубликовать, как должен выглядеть ваш словарь/карта и какой вывод JSON вы ожидаете от него?   -  person gigadot    schedule 13.12.2010


Ответы (4)


Похоже, вам просто нужен Map<String, Object> (или любой другой тип вашего ключа).

Примитивные значения будут заключены в соответствующие рамки:

Map<String, Object> map = new HashMap<String, Object>();

map.put("int", 20);
map.put("long", 100L);
// etc

Обратите внимание: чтобы получить значение и распаковать его, необходимо указать конкретный тип оболочки:

// Explicit unboxing
int x = (int) (Integer) map.get("int");
// Implicit unboxing
int y = (Integer) map.get("int");
// USing a method from Number instead
int z = ((Integer) map.get("int")).intValue();
person Jon Skeet    schedule 13.12.2010
comment
Боже Джон, ты действительно не спишь. Я собирался опубликовать то же самое. :) - person Buhake Sindi; 13.12.2010
comment
Другой вариант для чисел — Map‹String, Number›. - person Peter Lawrey; 13.12.2010
comment
@Peter Lawrey, ОП хочет значение также типа String. Номер не подходит. - person Buhake Sindi; 13.12.2010
comment
@The Elite Gentleman, хороший момент, как ни странно, неуниверсальные карты и словари сделали бы эту работу. - person Peter Lawrey; 13.12.2010
comment
Спасибо, Джон, мне нужно что-то подобное. Смотрите мой комментарий выше, чтобы понять мою проблему. - person ada; 13.12.2010
comment
@ada: Похоже, вам нужен JSONObject: json.org/javadoc/org/json /JSONObject.html - person Jon Skeet; 13.12.2010
comment
На самом деле я нашел кое-что получше. stackoverflow.com/questions/4078360 / FlexJSON имеет JSONDeserializer‹Map‹String,Object››, который отлично справляется со своей задачей. Все это время я пытался вместо этого использовать Hashtable‹String,Object›. Спасибо за помощь, Джон за предложение карты интерфейса. - person ada; 13.12.2010

Когда вы помещаете примитивы в Map в Java, они автоматически упаковываются в свою объектную форму. Например, если у вас есть Map, определенный как:

Map<Integer, String> myMap = new HashMap<Integer, String>();

тогда вы можете использовать примитивы типа int, так как они будут автоматически упакованы в Integer.

Что касается вашего исходного вопроса, определяющего Map как таковой:

// using Integer for key type, can be something else
Map<Integer, Object> myMap = new HashMap<Integer, Object>();

тогда вы сможете поместить любой объект Java на карту.

person Nico Huysamen    schedule 13.12.2010
comment
Карта является интерфейсом, поэтому new Map<Integer, Object>(); не соответствует действительности. - person Buhake Sindi; 13.12.2010

Вы можете использовать автоупаковку и использовать Integer вместо int и так далее.

Соответствующие типы (Integer, Double, Bool, ...) наследуют объект, поэтому вы можете использовать стандартный Map<Object, Whatever> и добавлять в него произвольные вещи.

person David    schedule 13.12.2010

Вы можете использовать Integer вместо int.

person munissor    schedule 13.12.2010