Java の Auto-Boxing とメソッドオーバーライド

ArrayList<Integer> list = new ArrayList<Integer>();
list.add(1);             // 値 1 を追加
list.add(0);             // 値 0 を追加
int value = list.get(1); // 値 0 を取得
list.remove(value);      // 値 0 を削除
list.add(0, value);      // 値 0 を先頭に追加

さあさあ、上記コードにはバグがありますよ。

バグフィックスしたコードは以下のとおり。

ArrayList<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(0);
int value = list.get(1);
list.remove(new Integer(value)); // ここ!
list.add(0, value);

ArrayList.remove って int を受け取って対象のインデックスを削除するものと Object を受け取って対象のオブジェクトを削除するものが存在するんだけど、要素がたまたま Integer で Auto-Boxing を使用していて、かつ値がインデックスとしても成り立っちゃう場合、期待通りに動作したりしなかったりするから性質が悪い。

int の時はきをつけなきゃいかんね。