尝试添加到List时,我有一个奇怪的UnsupportedOperationException。
我的代码如下:
if( map.containsKey(c)){
map.get(c).add(b);
} else {
temp = new ArrayList<MyClass>();
temp.add(b);
map.put(c, temp);
}
List是一个HashMap,列表为值。
当我运行这个自然在循环中迭代的代码时,我得到一个UnsupportedOperation异常。
如果我将其更改为:
List<ArrayList> list = (ArrayList<MyClass>) map.get(c);
list.add(b);
我没有例外。
任何人都可以解释一下吗?
答案 0 :(得分:1)
您所描述的似乎不可能。
List<ArrayList> list = (ArrayList<MyClass>) map.get(c);
中的类型转换对于调用add
时调用的方法没有任何影响。这不是方法覆盖的工作方式! (只有一个带有一个参数的add
方法,因此您不能通过该类型转换影响重载解析。)
同样,您可以投射到add
的列表上的ArrayList
会抛出UnsupportedOperationException
。 (这在理论上是可行的......但你需要创建一个ArrayList
的子类来实现这一点。当然你知道你已经做到了......而且你已经告诉我们了!)
我能想到的最佳解释是:
(其他可能的解释是你误读了堆栈跟踪,你正在运行尚未正确重建的“陈旧”代码等。)
答案 1 :(得分:0)
在进行添加调用之前,您需要将Map值类型转换为ArrayList,类似((ArrayList<MyClass>)(map.get(c))).add(b);
答案 2 :(得分:0)
在定义List
的{{1}}时,将其定义为
Map
而不是
List<Map<String, ArrayList<MyClass>>>
或强>
将List<Map<String, List<MyClass>>>
转换为List
ArrayList
并非每个((ArrayList<MyClass>)map.get(c)).add(b);
实现都支持List
方法。请参阅List#add() API文档,如果添加操作,则明确说明 UnsupportedOperationException - 此列表不支持。
答案 3 :(得分:0)
变化:
map.get(c).add(b);
为:
System.out.println(map.get(c).getClass());
map.get(c).add(b);
你真的是一个ArrayList吗?