HashMap(key:String,value:ArrayList)返回一个Object而不是ArrayList?

时间:2009-06-06 23:35:42

标签: java arraylist

我将数据存储在HashMap中(key:String,value: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是否返回一个Object而不是我存储在其中的ArrayList作为值?如何将此对象转换为ArrayList?

谢谢。

5 个答案:

答案 0 :(得分:35)

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。类型信息用于在编译期间进行类型安全检查。请参阅Generics documentation

另请注意,ArrayList也是作为泛型类实现的,因此您可能还想在其中指定类型。假设您的ArrayList包含您的班级MyClass,则上面的行可能是:

HashMap<String, ArrayList<MyClass>> dictMap

答案 1 :(得分:11)

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 :(得分:2)

我认为您的dictMap属于HashMap类型,因此默认为HashMap<Object, Object>。如果您希望它更具体,请将其声明为HashMap<String, ArrayList>,或者更好,将其声明为HashMap<String, ArrayList<T>>

答案 3 :(得分:2)

使用泛型(如上面的答案)是你最好的选择。我只是仔细检查过:

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

也会起作用,因为我不推荐它,因为泛型确保只添加正确的数据,而不是尝试在检索时进行处理。

答案 4 :(得分:2)

get的{​​{1}}方法返回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列表,应该根据需要进行更改。

有关泛型的更多信息,Java教程有一个lesson on generics