インターフェイスのput
メソッドの仕様を検討してください。Map#putが@throws ClassCastExceptionを指定するのはなぜですか?
それは言う:それぞれのキーオブジェクトと値オブジェクトのためのK
とV
:
@throws ClassCastException if the class of the specified key or value
prevents it from being stored in this map
Map
は2つの型パラメータとの一般的なインタフェースです。 put
メソッドシグネチャは次のとおりです。どのような条件の下で
V put(K key, V value);
は、このメソッドの呼び出しは、実行時にClassCastException
を引き起こす可能性がありますか?
コンパイラの警告を無視して、一般的な種類と生の種類が混在している場合は、この問題が発生する可能性があります。だから、効果的なJavaの2を再読み込みした後、私は(。アイテム#23頁112)unsafeAdd
例の後に次のようにモデル化:
public class MapClassCastException {
public static void main(String[] args) {
Map<Integer, String> m = new HashMap<>();
unsafePut(m);
System.out.println(m.get(1));
}
private static void unsafePut(Map m) { // beware: Raw Type
m.put("blow", "up");
m.put(new int[]{2, 4}, "xxx");
}
}
しかし、このコードはがではなく、それはnull
を印刷し、ClassCastException
と実行時に失敗しません。 (もちろん、私はコンパイラの警告を無視して、それをよく理解するだけです)。
Map#put
が実行時にClassCastException
をスローする可能性があることを示すことができますか? (私はJDK 1.6,1.7、そして1.8でこれを試してみて、同じ結果を出しました)。
「TreeMap」で試してみてください。 – chrylis
ああ、冷たい。ありがとう@chrylis。私はこの便利な 'Map'実装を忘れていました! –