2010-11-11 3 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))) 

Я знаю, что это не возможно, но я хотел бы написать что-то, что вызывает конструктор любого типа Т бывает. Я попытался использовать this(), который, очевидно, не работает, потому что метод «build» является статическим, и я попытался использовать отражение, чтобы определить класс T, но был в затруднении, чтобы выяснить, как его получить работать. Любая помощь приветствуется.

Спасибо,

Рой

+0

Как вы решите, что вам нужно подкласс? Это решение должно быть сформулировано и написано в коде как-то. Является ли решение основано на возвращаемом значении от jsonArray.get (i)? (Что все-таки возвращает этот метод?) – perp

ответ

0

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

+0

Если я назову «новая модель (json)», это переведёт в подкласс модели, когда я наследую ее? Я попробую это сейчас и посмотрю – royvandewater

+0

Нет, это не так. Но static build() не имеет никакого способа узнать, какой подкласс должен создать экземпляр, поэтому необходим другой подход. – perp

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

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

(Примечание: Пример имеет некоторую обработку упрощённым Exception)