CollectionのtoArray

CollectionインタフェースのtoArrayメソッドは、引数なしでObjectの配列を返す奴と、ある型Tの配列を引数に取ってTの配列を返す奴がある。

なんで、引数なしの奴はTの配列を返さないんだろうと思ってたが、

T[] result = new T[size];

とか出来ないのか。


でも、だとすると引数付きの奴で要素数が足りない時どうするんだろう?
てことで調べてみると、

T[] r = a.length >= size ? a :
    (T[])java.lang.reflect.Array
    .newInstance(a.getClass().getComponentType(), size);

AbstractCollectionの中では、引数の要素のClassクラスから、リフレクション使って作ってた。


ArrayListも見てみると、

return (T[]) Arrays.copyOf(elementData, size, a.getClass());

ArraysのcopyOfメソッドで、引数のClassクラス渡して作ってた。
要素を保持しているフィールドelementDataはObjectの配列だった。


copyOfの中では、

T[] copy = ((Object)newType == (Object)Object[].class)
    ? (T[]) new Object[newLength]
    : (T[]) Array.newInstance(newType.getComponentType(), newLength);

Objectの配列以外はリフレクション使って作ってた。(Arrayはjava.lang.reflect.Array)