List インターフェースで定義されているメソッドを見ていました<T> T[] toArray(T[] a)
が、質問があります。なぜジェネリックなのですか?そのため、メソッドは完全な型安全ではありません。次のコード フラグメントはコンパイルされますが、原因は次のとおりですArrayStoreException
。
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
String[] stringArray = list.toArray(new String[]{});
toArray がジェネリックではなく、List 型のパラメータをとった方が良いように思えます。
私はおもちゃの例を書きましたが、ジェネリックがなくても問題ありません:
package test;
import java.util.Arrays;
public class TestGenerics<E> {
private Object[] elementData = new Object[10];
private int size = 0;
public void add(E e) {
elementData[size++] = e;
}
@SuppressWarnings("unchecked")
//I took this code from ArrayList but it is not generic
public E[] toArray(E[] a) {
if (a.length < size)
// Make a new array of a's runtime type, but my contents:
return (E[]) Arrays.copyOf(elementData, size, a.getClass());
System.arraycopy(elementData, 0, a, 0, size);
if (a.length > size)
a[size] = null;
return a;
}
public static void main(String[] args) {
TestGenerics<Integer> list = new TestGenerics<Integer>();
list.add(1);
list.add(2);
list.add(3);
//You don't have to do any casting
Integer[] n = new Integer[10];
n = list.toArray(n);
}
}
そのように宣言されている理由はありますか?