次のコードについて、正しい選択肢を選んでください
HashSet<Short> set = new HashSet<>() {{
add((short)0);
add((short)1);
add((short)2);
}};
for(short i = 1; i <= 3; i++) {
set.remove(i - 1);
}
System.out.println(set);
- [0, 1, 2]が出力される
- 何も出力されない
- []が出力される
- コンパイルエラー
- 実行時エラー
解答
正解: 1
[0, 1, 2]
{}の中はインスタンス初期化ブロックで、このブロック内でaddメソッドを使ってセットに要素を追加しています。
この時点で、setにはShort
型の0, 1, 2の3つの要素が含まれています。
remove(i - 1)
ではshort
とint
の式なのでInteger
にボクシングされます。
HashSetではShort型を扱いますが、Integer
オブジェクトを削除しようとしているため、remove
は何もしません。
Collection<E>.remove(Object obj)
では、どんなオブジェクトでも削除できますが、それが予期せぬ結果を招くことがあります。
要素を削除する場合、remove()
の引数を明示的にキャストする必要があります。
set.remove((short)(i - 1));
出力
[]