2012-03-29 66 views
1

可能重複:
Create instance of generic type in Java?無法構造泛型類型參數,該怎麼做呢?

我才發現原來的Java不會讓你努力寫下這之後構建的泛型類型參數的新實例:

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; 
} 

這不會編譯,但我認爲它明顯是我想要做的。我該怎麼做?

+0

可以包含錯誤信息嗎?我不認爲Java讓你在泛型對象上做構造函數。 – 2012-03-29 02:26:07

+0

@BrianNickel你是對的。這是一個如果Java支持這個的例子。 – Drew 2012-03-29 02:34:39

+0

泛型實現實際上是我使用.Net(http://msdn.microsoft.com/en-us/library/sd2w2ew5.aspx)時錯過的更大的東西。你會認爲bean是Java中如此常見的組件,它們會讓它變得容易。 – 2012-03-29 03:43:45

回答

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

反射是一種選擇;另一個就是讓你的方法有第二個參數,一個有基礎的工廠。比如,番石榴定義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; 
} 

(?我記得,JSONArray.get(int)回報Object,右如果沒有,請更換工廠的F與任何該方法返回)

這裏的想法是,呼叫站點將知道C實際上是什麼,並且它將能夠定義Function的實現,其給定JSON數組元素,返回新的C實例。最有可能的是,你將這個匿名課程作爲private static final