我将数据存储在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?
谢谢。
答案 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。