2013-02-26 102 views
1

我得到了幾個基本相同的類。我在構造函數中傳遞了一個JSONObject,它設置了一些變量。我如何使用泛型類的構造函數

現在我有一些其他的類創建這些第一類,並將它們添加到一個ArrayList。現在我想將第二個類合併爲一個使用泛型的類。

這就是我想做的事:

public class Data<T> { 
    public ArrayList<T> data; 

    public Data(String response1) { 
     data = new ArrayList<T>(); 
     JSONArray ja; 

     try { 
       ja = new JSONArray(response1); 
       for (int i = 0; i < ja.length(); i++) { 
        JSONObject jo = (JSONObject) ja.get(i); 
        data.add(new T(jo)); 
       } 
     } catch (JSONException e) { 
       e.printStackTrace(); 
     } 
    } 
} 

,但它沒有讓我創建T的實例與

new T(jo); 

將是很好,如果有人能幫助我

+1

只是一個問題:如果「T」通用類型是在運行時的界面,在一個特定的數據實例,比如說Data 「new T(something)」應該如何工作? – ppeterka 2013-02-26 14:58:27

+0

這是一個很奇怪的。你甚至沒有指定泛型類型'T'的超類。它如何理解這種構造? – Andremoniy 2013-02-26 14:59:09

+0

看到這個:http://stackoverflow.com/questions/182636/how-to-determine-the-class-of-a-generic-type – 2013-02-26 15:00:13

回答

3

有這個情況標準招:通過Class<T>String data到調用一起,並添加setter爲JSONObject。這將讓你調用一個參數的構造函數,像這樣:

interface WithJson { 
    void setJson(JSONObject jo); 
} 

public class Data<T extends WithJson> { 
    public Data(String response1, Class<T> type) { 
     data = new ArrayList<T>(); 
     JSONArray ja; 
     try { 
      ja = new JSONArray(response1); 
      for (int i = 0; i < ja.length(); i++) { 
       JSONObject jo = (JSONObject) ja.get(i); 
       T obj = type.newInstance(); 
       object.setJson(jo); 
       data.add(obj); 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Class<T>已經在Java 5中進行了修改,讓你使用它作爲一個工廠該類的實例。爲了安全起見,需要靜態檢查type.newInstance。通過添加接口WithJson,您可以通過編譯器可靜態檢查的方式在T的實例上調用setJson方法。

當你構建Data<T>,你需要通過類被創建,就像這樣:

Data<MyContent> d = new Data(jsonString, MyContent.class); 
+0

如果我創建一個新的數據實例,我必須通過旁邊的字符串 – Cheetah 2013-02-26 15:26:55

+0

@Cheetah這是我在原始回覆中遺漏的重要內容。我編輯了答案,以表明要做什麼。我還修復了一個複製粘貼錯誤(我將'Class type'粘貼到錯誤的地方)。 – dasblinkenlight 2013-02-26 15:30:40

+0

作品完美。謝謝。 – Cheetah 2013-02-26 15:35:27

0

使用一個通用的工廠界面。

public interface Factory<T> 
{ 
    public T createFromJSONObject(JSONObject jo); 
} 

現在修改的構造函數:

public Data(
    String response1, 
    Factory<T> factory 
) { 
    data = new ArrayList<T>(); 
    JSONArray ja; 

    try { 
      ja = new JSONArray(response1); 
      for (int i = 0; i < ja.length(); i++) { 
       JSONObject jo = (JSONObject) ja.get(i); 
       data.add(factory.createFromJSONObject(jo)); 
      } 
    } catch (JSONException e) { 
      e.printStackTrace(); 
    } 
} 
相關問題