Как я могу получить доступ к конструктору Java в общем виде? - PullRequest
3 голосов
/ 11 ноября 2010

У меня есть метод статического компоновщика для класса «Модель», который принимает строку JSON и возвращает ArrayList of Models. Я хотел бы, чтобы он ссылался на конструктор Модели в целом, чтобы подклассы могли наследовать метод построителя.

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, но не мог понять, как его получить работать. Любая помощь с благодарностью.

Спасибо

Рой

Ответы [ 2 ]

1 голос
/ 11 ноября 2010

Обходной путь для «динамического создания экземпляра» с обобщениями заключается в передаче подсказки классу или методу:

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

Я рад предоставить дополнительную помощь / идеи, но я не уверен, чтоВы хотите достичь с помощью своего технического решения.

(Примечание: в примере есть упрощенная обработка исключений)

0 голосов
/ 11 ноября 2010

Как это написано сейчас, я не вижу, чтобы параметр типа T в build () имел какое-либо применение. Разве вы не можете просто уронить его и использовать модель вместо нее? Если это так, это решит вашу проблему строительства.

...