2011-01-21 6 views
2

Javaでジェネリックタイプのアレイを作成する方法として、Array.newInstanceスタティックメソッドを検討してください。 は、私は何をどのように見ることができないんだと、nullジェネリック型引数から一般的な配列を作成することです:私はJavaジェネリックアレイのヌルジェネリックタイプ

/** 
* Creates and fills a generic array with the given item 
*/ 
public static <T> T[] create(T item, int length) 
{ 
    T[] result = (T[]) Array.newInstance(item.getClass(), length); 

    for(int i = 0; i < length; i++) 
     result[i] = item; 

    return result; 
} 

上記の作品を呼び出すときに、例えばcreate( "abc"、10);私は、配列のすべての位置に "abc"という長さ10のString []を取得しています。 しかし、どのようにしてNULL文字列引数を返すと、長さ10の文字列配列を返すことができ、すべての位置にnullがありますか?

String nullStr = null; 
String[] array = create(nullStr, 10); // boom! NullPointerException 

おそらく(それがnullだと)、そのメンバーの1を使用せずに、「項目」のクラスを取得する方法はありますか?
私はちょうど新しい配列を得ることができることを知っていますString [] array = new String [10]、それはポイントではありません。

ありがとうございました

+0

残っているタイプの情報のみが 'item'となっています(しかし、この情報はヌルなら自然ではありません:-)。これは、代わりに[Class](http://download.oracle.com/javase/6/docs/api/java/lang/Class.html)を使用するか、おそらく 'create(SomeDefault、10) '、例えば'create(" "、10)' FYI:C#(Javaではない)は、[reified types](http://gafter.blogspot.com/2006/11/reified-generics-for-java.html)を持ち、 'typeof(T)'をサポートしています。ああ、タイプ消去についても話しているreified型へのリンクを調べてください: –

答えて

3

多分これは便利です。あなたのコードは、タイプを判断することはできません

create(null, 10) 

ので(それはnull.getClass() => NPEを呼び出して終了):あなたが指摘するように

public static <T> T[] create(Class<T> clazz, int length) 
{ 
    T[] result = (T[]) Array.newInstance(clazz, length); 
    return result; 
} 
+0

clazz = nullの場合でもNullPointerExceptionをスローします – pablochan

+1

@pablochan "Naturally" :-)しかし、違いは指定された型に対してアクセス可能なクラスがあることです。 「マニフェスト」を通すのは、呼び出し側の責任です。 –

+0

@pst:OPのコードよりも役に立ちません。 – pablochan

2

、あなたは呼び出すことはできません。

あなたは別にクラスを渡すことができます。

public static <T> T[] create(Class<T> type, int length, T fillValue) 
{ 
    T[] result = (T[]) Array.newInstance(type, length); 

    for(int i = 0; i < length; i++) 
     result[i] = fillValue; 

    return result; 
} 

// Some optional convenience signatures: 

public static <T> T[] create(Class<T> type, int length) { 
    return create(type, length, null); 
} 

public static <T> T[] create(T fillValue, int length) { 
    if (fillValue == null) { 
     throw new IllegalArgumentException("fillValue cannot be null"); 
    } 
    return create(fillValue.getClass(), length, fillValue); 
} 

public static void main(String[] args) { 
    String[] a = create(String.class, 10, null); 
} 
1

をさて、なぜ代わりに、Classオブジェクトを取り、ちょうど直接String.classに渡す方法を変更しませんか?クラスタイプがないため、Javaはnullのクラスタイプを取得できません。任意のオブジェクトはnullでもかまいません。

関連する問題