2010-11-11 37 views
3

我有一个类“模型”的静态生成器方法,它需要一个JSON字符串并返回一个模型的ArrayList。我希望它通常引用模型的构造器,以便子类可以继承构建器方法。如何以通用方式访问Java构造函数?

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(),这显然不起作用,因为方法“构建”是静态的,我试图使用反射来确定T的类,但一直在弄清楚如何得到它上班。任何帮助是极大的赞赏。

感谢,

罗伊

+0

你如何决定你需要什么子?这个决定需要以某种方式制定和编写。是基于jsonArray.get(i)的返回值的决定吗? (无论如何,该方法会返回什么?) – perp 2010-11-11 06:56:20

回答

0

现在写入的方式,我看不到在建T形参数()是不得以任何用途。难道你不能放下它并在其位置使用模型?如果是这样,那将解决您的施工问题。

+0

如果我称之为“new Model(json)”,那么当我继承它时,它会转换为Model的子类吗?我现在就试试看看 – royvandewater 2010-11-11 06:43:46

+0

不,它不会。但是静态build()无法知道要实例化的子类,所以需要一种不同的方法。 – perp 2010-11-11 06:49:08

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

我很高兴能提供更多的帮助/想法,但我不知道你是什么想用您的技术解决方案实现

(注:例如有一些过于简单的异常处理)