次のコードについて、正しい選択肢を選んでください
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));
出力
[]