Arrays.asList の罠

  • 36
    Like
  • 4
    Comment
More than 1 year has passed since last update.

問題

文字列のリストは、Arrays.asList を使うと次のように初期化できる。

String[] array = {"abc", "def"};
List<String> list = Arrays.asList(array);

しかし、int型の配列を同様に扱おうとすると、怒られる。

// コンパイルエラー
int[] array = {0, 1};
List<Integer> list = Arrays.asList(array);

実際の現場でやるなら、下記のようにするしかないぽい。

int[] array = {0, 1};
List<Integer> list = new ArrayList<Integer>(array.length);
for (int i = 0; i < array.length; i++) {
    list.add(array[i]);
}

何とも悩ましい。

原因

Arrays.asList は、プリミティブ型の配列をリスト化してくれない。
いや、正確にはリスト化はしてくれるものの、プリミティブ型の配列全体を単一の要素として扱うため極めて直感と異なる動作をする。
参照:http://aoking.hatenablog.jp/entry/20110415/1302824606

ということらしい。
ということは、Integerのオブジェクトの配列ならイケるってことか?

Integer[] array = {new Integer(1), new Integer(2)};
List<Integer> list = Arrays.asList(array);

イケた。が、Integer型とか普段使わないしな...
問題の根が深そうなのでひとまずメモ、ということで。