8

Javaでは ではなく がArray.newInstance()返されることに気付きました。Java がジェネリック型をサポートする前にこのメソッドが導入されたので、これは理解できます。ObjectT[]

ただし、これに相当する汎用バージョンがないことは驚きです。Java 7Arrays.copyOfは同じではありません。新しいダミー配列を作成するのではなく、パラメーターの内容をコピーします (内部にすべての null オブジェクトがあります)。

これの実装は些細なことのように思えるので、それを JRE に追加しない理由はありますか? または私はそれを見つけることができませんか?

アップデート

質問の誤解を防ぐために、私自身の「些細な」実装を提供するようです。

class MyArrayUtil {
    //Generic version for classes
    @SuppressWarnings("unchecked")
    public static <T> T[] newArrayOf(T[] t, int len){
        return (T[]) Array.newInstance(t.getClass().getComponentType(), len);
    }
    //For array of int
    public static int[] newArrayOf(int[] t, int len){
        return new int[len];
    }
    //For other primitive types...
}

このコードは質問の回答ではないため、回答として投稿していません。問題は、実装方法ではなく、理由および/または既存のコードに関するものです。

アップデート

コードを に似るように更新しましArrays.copyOfた。利点は、プログラマーがパラメーターの型を簡単に変更して、コードを別の型に調整できることです。Array.newInstanceまた、 for プリミティブ型の使用を排除しました。

4

3 に答える 3

8

Guava はまさにそのような機能を提供します。Guava (または Apache Commons) が、何らかの理由で JDK にはない一般的に使用されるヘルパーを提供したのはこれが初めてではありません。

あなたはこれを知っているかもしれませんが、将来これに出くわすグーグルユーザーのためのいくつかの背景: 署名を汎用にすることができない理由は、メソッドが Java 1.4でArray.newInstance 返さObjectれるためです。返品も承りObjectます。次のように一般化されていた場合:

<T> T[] newInstance(Class<T> componentType, int length)

...その場合、戻り値の型はObject[]ではなくになりObjectます。これは下位互換性を壊すことになり、Java 設計者はこれを回避するために常に非常に懸命に努力してきました。

メソッドは Java 1.6 でのみ導入されたArrays.copyOfため、下位互換性について心配する必要はありませんでした。

于 2013-07-19T05:04:28.883 に答える
4

いいえ、具象型をパラメーターとして何らかの方法で渡す必要があります。あなたが述べたように、Arrays.copyOfこれを実際に示しています。

Class<T> type = determinteTheTypeSomehow();
return (T[]) Array.newInstance(type, length);
于 2013-07-19T03:15:16.897 に答える