2012-03-15 6 views
1

openjdkのjava.util.Arraysのこのコードを理解できません。私はなぜこのコードがリフレクション(Array.newInstance)を使用しているのか、型が同じかどうかをチェックするのが不思議です。なぜT [] copy =(T [])new Object [newLength]は型Tと型Uが異なっていてもできないのですか?JavaではなぜArrays.copyOfのソースコードが反射を使用するのですか?

public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) { 
    T[] copy = ((Object)newType == (Object)Object[].class) 
     ? (T[]) new Object[newLength] 
     : (T[]) Array.newInstance(newType.getComponentType(), newLength); 
    System.arraycopy(original, 0, copy, 0, 
        Math.min(original.length, newLength)); 
    return copy; 
} 
+0

なぜあなたは 'Array.newInstance'がリフレクションだと思いますか? AIUIは、パラメータ化されたクラスの配列を構築するための単なる「通常の」メソッドです。 –

+2

@Andrzejクラスは 'java.lang.reflect'パッケージの一部です。これは、なぜ彼がリフレクションを仮定したかについてのかなり良い議論と考えています。これは実際にはネイティブメソッドです。おそらく、仕事中のJVM組み込み関数です。 – Voo

+0

@VooTouché、私はそのパッケージに気づいたことはありません。 –

答えて

4

それはことができます - しかし、その後、あなたがString[]を求めたのだ場合でもObject[]で終わるだろう。 Array.copyOfは、常に実際にObject[]を返した場合

String[] strings = Arrays.copyOf(existingArray, 10, String[].class); 
Object[] objects = strings; 
objects = new Object(); 

...しかし、それなりません:だからこの失敗するはずです。

+0

typo:最後の行に「オブジェクト」のインデックスを割り当てる必要があります。 'objects [0] = new Object();' – pnkfelix

0

このような汎用タイプから配列をインスタンス化することはできませんnew T[newLength]。だからあなたができるのはnew Object[newLength]です。しかし、ArrayはArrayStoreExceptionをスローするためにアイテムタイプに関する情報を格納しますが、この場合は失われます。

+0

'new T []'さえも仕様に合わないでしょう。 –

関連する問題