3

我有一个用于“模型”类的静态构建器方法,它采用 JSON 字符串并返回模型的 ArrayList。我希望它通常引用模型的构造函数,以便子类可以继承构建器方法。

public class Model
{
    protected int id;

    public Model(String json) throws JSONException 
    {
        JSONObject jsonObject = new JSONObject(json);
        this.id = jsonObject.getInt("id");
    }

    public static <T extends Model> ArrayList<T> build(String json) throws JSONException
    {
        JSONArray jsonArray = new JSONArray(json);

        ArrayList<T> models = new ArrayList<T>(jsonArray.length());

        for(int i = 0; i < jsonArray.length(); i++)
            models.add( new T(jsonArray.get(i)) )

        return models;
    }
}

这是该类的简化实现,相关行是

models.add( new T(jsonArray.get(i)) )

我知道这是不可能的,但我想写一些东西来调用 T 类型的构造函数。我尝试使用 this(),这显然不起作用,因为方法“build”是静态的,我尝试使用反射来确定 T 的类,但不知如何获得它去工作。任何帮助是极大的赞赏。

谢谢,

罗伊

4

2 回答 2

1

使用泛型进行“动态实例化”的解决方法是将提示传递给类或方法:

public class Model<T> {
  Class<T> hint;
  public Model(Class<T> hint) {this.hint = hint;}

  public T getObjectAsGenericType(Object input, Class<T> hint) throws Exception {
    return hint.cast(input);
  }

  public T createInstanceOfGenericType(Class<T> hint) throws Exception {
    T result = hint.newInstance();
    result.setValue(/* your JSON object here */);
    return result;
  }
}

我很乐意提供更多帮助/想法,但我不确定您希望通过技术解决方案实现什么目标。

(注:示例有一些过度简化的异常处理)

于 2010-11-11T06:56:24.597 回答
0

按照现在的写法,我看不出 build() 中的 T 类型参数有什么用处。你不能放弃它并使用 Model 代替它吗?如果是这样,那将解决您的施工问题。

于 2010-11-11T06:41:04.950 回答