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)