HashMap (key: String, value: ArrayList) возвращает объект вместо ArrayList? - PullRequest
6 голосов
/ 07 июня 2009

Я храню данные в HashMap с (ключ: String, значение: ArrayList). Часть, с которой у меня возникают проблемы, объявляет новый ArrayList «current», ищет в HashMap строку «dictCode» и, если она найдена, устанавливает current в качестве возвращаемого значения ArrayList.

ArrayList current = new ArrayList();      
if(dictMap.containsKey(dictCode)) {
    current = dictMap.get(dictCode);   
}

Строка "current = ..." возвращает ошибку компилятора:

Error: incompatible types
found   : java.lang.Object
required: java.util.ArrayList

Я не понимаю этого ... возвращает ли HashMap объект вместо ArrayList, который я хранил в нем в качестве значения? Как мне преобразовать этот объект в ArrayList?

Спасибо.

Ответы [ 5 ]

35 голосов
/ 07 июня 2009

Как декларация HashMap выражается в этой области? Должно быть:

HashMap<String, ArrayList> dictMap

Если нет, предполагается, что это Объекты.

Например, если ваш код:

HashMap dictMap = new HashMap<String, ArrayList>();
...
ArrayList current = dictMap.get(dictCode);

это не сработает. Вместо этого вы хотите:

HashMap<String, ArrayList> dictMap = new HashMap<String, Arraylist>();
...
ArrayList current = dictMap.get(dictCode);

Способ работы дженериков заключается в том, что информация о типе доступна компилятору, но недоступна во время выполнения. Это называется стиранием типа. Реализация HashMap (или любая другая универсальная реализация) имеет дело с Object. Информация о типе предназначена для проверки безопасности типов во время компиляции. См. Общая документация .

Также обратите внимание, что ArrayList также реализован как универсальный класс, и, таким образом, вы можете указать и там тип. Предполагая, что ваш ArrayList содержит ваш класс MyClass, строка выше может быть:

HashMap<String, ArrayList<MyClass>> dictMap
11 голосов
/ 07 июня 2009
public static void main(String arg[])
{
    HashMap<String, ArrayList<String>> hashmap = 
        new HashMap<String, ArrayList<String>>();
    ArrayList<String> arraylist = new ArrayList<String>();
    arraylist.add("Hello");
    arraylist.add("World.");
    hashmap.put("my key", arraylist);
    arraylist = hashmap.get("not inserted");
    System.out.println(arraylist);
    arraylist = hashmap.get("my key");
    System.out.println(arraylist);
}

null
[Hello, World.]

Работает нормально ... возможно, вы найдете ошибку в моем коде.

2 голосов
/ 07 июня 2009

Метод get для HashMap возвращает Object, но ожидается, что переменная current примет ArrayList:

ArrayList current = new ArrayList();
// ...
current = dictMap.get(dictCode);

Чтобы вышеприведенный код работал, Object должен быть приведен к ArrayList:

ArrayList current = new ArrayList();
// ...
current = (ArrayList)dictMap.get(dictCode);

Однако, возможно, лучшим способом было бы в первую очередь использовать универсальные объекты коллекции:

HashMap<String, ArrayList<Object>> dictMap =
    new HashMap<String, ArrayList<Object>>();

// Populate the HashMap.

ArrayList<Object> current = new ArrayList<Object>();      
if(dictMap.containsKey(dictCode)) {
    current = dictMap.get(dictCode);   
}

В приведенном выше коде предполагается, что ArrayList имеет список Object с, и его следует изменить при необходимости.

Для получения дополнительной информации о дженериках, в Учебниках Java есть урок по дженерикам .

2 голосов
/ 07 июня 2009

Использование дженериков (как в ответах выше) - ваш лучший выбор здесь. Я только что проверил дважды и:

    test.put("test", arraylistone); 
    ArrayList current = new ArrayList();
    current = (ArrayList) test.get("test");

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

2 голосов
/ 07 июня 2009

Полагаю, ваша dictMap имеет тип HashMap, что делает его по умолчанию HashMap<Object, Object>. Если вы хотите, чтобы он был более конкретным, объявите его как HashMap<String, ArrayList> или, что еще лучше, как HashMap<String, ArrayList<T>>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...