2012-03-29 6 views
1

可能性の重複:ジェネリック型の引数を構築できません。代わりに何をしますか?

public static <C extends JSONSerializable> List<C> JSONtoList(JSONArray data) { 
    List<C> list = new ArrayList<C>(); 
    for (int i = 0; i < data.length(); i++){ 
     list.add(new C(data.get(i))); 
    } 
    return list; 
} 
:私はJavaがこれを書き込もうとした後、ジェネリック型引数の新しいインスタンスを作成できませんことがわかっ

Create instance of generic type in Java?

これはコンパイルされませんが、私はそれが明らかに何をしようとしていると思います。どうしたらいいですか?

+0

エラーメッセージを含めることはできますか?私はJavaがジェネリックオブジェクトのコンストラクタをやってくれるとは思わない。 –

+0

@BrianNickelあなたは正しいです。これは、Javaがこれをサポートしていた場合の私のやり方の例です。 – Drew

+0

ジェネリックの実装は、実際に.Net(http://msdn.microsoft.com/en-us/library/sd2w2ew5.aspx)で作業することで逃した大きなものです。あなたは豆がJavaのような共通のコンポーネントであると考えているでしょう。 –

答えて

1

あなたがGSONを使用している場合、これは実際には非常に簡単です:

public static <C extends JSONSerializable> List<C> jsonToList(JsonArray data, Class<C> type) { 
    Gson gson = new Gson(); 
    List<C> list = new ArrayList<C>(); 
    for (JsonElement e : data) 
     list.add(gson.fromJson(e, type)); 
    return list; 
} 

そうでない場合、あなたは反射やClassnewInstance方法を使用する必要があります。

0

反射は1つのオプションです。もう1つは、メソッドが第2引数を取ることです。例えば、グアバはFunctionを定義します。

public interface Function<F,T> { 
    T apply(F input); 
} 

public static <C extends JSONSerializable> List<C> JSONtoList(
    JSONArray data, 
    Function<Object,C> factory) 
{ 
     List<C> list = new ArrayList<C>(); 
     for (int i = 0; i < data.length(); i++) { 
      C instance = factory.apply(data.get(i)) // instead of new 
      list.add(instance); 
     } 
     return list; 
} 

(I思い出すと、JSONArray.get(int)戻りObject、右でない場合は、工場出荷時のF何でも、そのメソッドが返すとを交換する?。)

ここでの考え方があることです呼び出しサイトはCが実際に何であるかを知り、Functionの実装を定義することができ、JSON配列要素を指定すると、新しいCインスタンスが返されます。おそらく、これは匿名のprivate static finalクラスになります。