尝试添加到List时,UnsupportedOperationException,仅当未强制转换为Arraylist时

时间:2013-04-21 06:10:20

标签: java arraylist

尝试添加到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);

我没有例外。

任何人都可以解释一下吗?

4 个答案:

答案 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吗?