7

我使用(键:字符串,值:ArrayList)将数据存储在HashMap中。我遇到问题的部分声明了一个新的 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?

谢谢你。

4

5 回答 5

40

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包含您的 class MyClass,上面的行可能是:

HashMap<String, ArrayList<MyClass>> dictMap
于 2009-06-06T23:42:15.603 回答
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.]

工作正常......也许你在我的代码中发现了你的错误。

于 2009-06-06T23:52:39.217 回答
2

我想你的 dictMap 是 type HashMap,这使得它默认为HashMap<Object, Object>. 如果您希望它更具体,请将其声明为HashMap<String, ArrayList>,甚至更好,为HashMap<String, ArrayList<T>>

于 2009-06-06T23:43:05.880 回答
2

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

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

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

于 2009-06-06T23:49:16.180 回答
2

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有一个Objects 列表,并且应该根据需要进行更改。

有关泛型的更多信息,Java 教程有一个关于泛型的课程。

于 2009-06-06T23:50:36.053 回答