-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 Exception が発生します。

それを次のように変更すると:

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引数が 1 つのメソッドは 1 つしかないため、その型キャストでオーバーロードの解決に影響を与えることはできません。)

addまた、キャストできるリストで をArrayListスローするのも意味がありませんUnsupportedOperationException。(理論的には可能です...しかし、それが起こるには のサブクラスを作成する必要がありますArrayList。そして、あなたはそれをしたことを知っているでしょう...そして私たちに言ったでしょう!)

私が考えることができる最良の説明は次のとおりです。

  • 型キャストは例外で失敗します (これは私が期待していたものです...ここに「変更不可能な」ラッパークラスがあると推測しているため)、および
  • 「押しつぶされている」ため、その例外に気づいていません。

(他の考えられる説明としては、スタックトレースを読み間違えた、適切に再構築されていない「古い」コードを実行している、などがあります。)

于 2013-04-21T06:21:59.633 に答える
0

の を定義する際Listに、次のMapように定義します。

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

それ以外の

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

また

to を型キャストListするArrayList

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

すべてListの実装がメソッドをサポートしているわけではありません。List #add() APIドキュメントをadd()参照してください。UnsupportedOperationException - if the add operation is not supported by this listと明確に記載されています。

于 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 に答える
0

add 呼び出しを行う前に、 Map 値を ArrayList に型キャストする必要があります。((ArrayList<MyClass>)(map.get(c))).add(b);

于 2013-04-21T06:12:50.507 に答える