-2

尝试添加到列表时出现奇怪的 UnsupportedOperationException。

我的代码如下:

if( map.containsKey(c)){
    map.get(c).add(b);
} else {
    temp = new ArrayList<MyClass>();
    temp.add(b);
    map.put(c, temp);
}

List 是一个以 List 作为值的 HashMap。

当我运行这个自然循环迭代的代码时,我得到一个 UnsupportedOperation 异常。

如果我将其更改为:

List<ArrayList> list = (ArrayList<MyClass>) map.get(c);
list.add(b);

我没有例外。

谁能解释一下?

4

4 回答 4

1

你所描述的似乎是不可能的。

类型转换List<ArrayList> list = (ArrayList<MyClass>) map.get(c);应该对调用时调用的方法没有影响add。这不是方法覆盖的工作原理!(只有一种add方法带有一个参数,因此您不能使用该类型转换影响重载决议。)

add同样,在您可以投射到的列表上ArrayListthrow也没有任何意义UnsupportedOperationException。(理论上是可能的......但你需要创建一个子类ArrayList才能发生这种情况。而且你肯定知道你已经做到了......并且你会告诉我们!)

我能想到的最好的解释是:

  • 类型转换失败并出现异常(这是我所期望的......因为我的猜测是你在这里有一个“不可修改”的包装类),并且
  • 您没有注意到该异常,因为它被“压扁”了。

(其他可能的解释是您误读了堆栈跟踪,您正在运行尚未正确重建的“陈旧”代码等)

于 2013-04-21T06:21:59.633 回答
0

在进行添加调用之前,您需要将 Map 值类型转换为 ArrayList,例如((ArrayList<MyClass>)(map.get(c))).add(b);

于 2013-04-21T06:12:50.507 回答
0

在定义Listof 时Map,将其定义为

List<Map<String, ArrayList<MyClass>>>

代替

List<Map<String, List<MyClass>>>

或者

类型转换ListArrayList

((ArrayList<MyClass>)map.get(c)).add(b);

并非每个List实现都支持该add()方法。请参阅List#add() API文档,其中明确指出UnsupportedOperationException -如果此列表不支持添加操作

于 2013-04-21T06:17:27.060 回答
0

改变:

map.get(c).add(b);

至:

System.out.println(map.get(c).getClass());
map.get(c).add(b);

它真的是您拥有的 ArrayList 吗?

于 2013-04-21T06:28:43.670 回答