1

基本的に同じことをする複数のクラスを取得しました。コンストラクターでJSONObjectを渡し、いくつかの変数を設定します。

今、私はそれらの最初のクラスを作成し、それらをArrayListに追加する他のいくつかのクラスを取得しました。次に、ジェネリックを使用して2番目のクラスを1つにマージします。

これが私がやりたいことです:

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

誰かが私を助けることができればいいでしょう

4

2 に答える 2

3

この状況には標準的なトリックがあります:Class<T>と一緒にString data呼び出しに渡し、 のセッターを追加し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を呼び出すことができます。setJsonT

を構築するときはData<T>、作成中のクラスを次のように渡す必要があります。

Data<MyContent> d = new Data(jsonString, MyContent.class);
于 2013-02-26T15:03:35.580 に答える
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();
     }
 }
于 2013-02-26T15:02:56.483 に答える