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

如果有人可以帮助我会很好

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调用setJson实例上的方法。T

构造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 回答