Что такое система ввода Java Hashmap? - PullRequest
2 голосов
/ 14 февраля 2012

Я хочу сохранить атрибуты сущности с хэш-картой. Значение может быть либо встроенным int, либо List из String.

name : "John Smith"
attributes:
   "seniority" : (int) 7
   "tags" : List<String>("asst_prof","cs_dept")
   "another_attrib" : (int) 3

Я запутался в системе ввода Карты после прочтения различных инструкций, которые дает Google. Самым близким, к которому я пришел, было то, что использовало ключи String и значения Object.


Вопрос: Как создать таблицу Hashmap и вставить значения int или List<String>, чтобы при извлечении значения это было typecast (идентифицируется как член типа ) как int или List<String>, а не Object.

Я зависел от пакета Drools Expert, который сам получает доступ к значениям из карт , поэтому типизация не в моем контроле .

// Same as attributes.get("jsmith").isValid()
Person( attributes["jsmith"].valid )

Ответы [ 3 ]

3 голосов
/ 14 февраля 2012

Вы не можете. Либо вы используете базовую форму Map, которая хранит и возвращает значения в виде объектов, а затем вы должны привести их самостоятельно:

Object value = map.get(key);

if (value instanceof List<String>) {
    List<String> myList = (List<String>) value;
}

С целыми числами вы не можете хранить примитивный тип int, но он будет автоматически упакован в целое число. Таким образом, вы должны проверить instanceof Integer, а затем вызвать .intValue() для Integer объекта.

Чтобы получить возвращенные Объекты в качестве Объектов, вам нужно использовать Generics, но вы не можете смешивать типы. Таким образом, вам придется создать карту из List<String> атрибутов и другую для атрибутов int.

1 голос
/ 14 февраля 2012

В Drools вы можете отключить безопасность типов времени компиляции для определенных типов, если хотите. В этом случае Drools будет работать как язык с динамической типизацией и разрешать типы во время выполнения для данного типа. Пример:

declare Person
    @typesafe(false)
end

rule X
when
    Person( attributes["seniority"] == 7 ) // resolving seniority to Number
...

rule Y
when
    Person( attributes["tags"].size() > 1 ) // resolving tags to List
...
1 голос
/ 14 февраля 2012

То, что вы предлагаете, является примером алгебраического типа данных .К сожалению, они не поддерживаются в Java.

Вам нужно будет использовать Map и привести значение либо к Integer (int), либо к List самостоятельно.

...