2016-04-06 2 views
1

Я пытаюсь получить массив JSON к deserliaze при использовании дженериков см моя работа ниже:Gson fromJson используя общий суперкласс

public class Lookup<T extends Profile> { 

    protected final Class<T> getSuperClass() { 
     ParameterizedType superClass = (ParameterizedType)this.getClass().getGenericSuperclass(); 
     return (Class<T>)(superClass.getActualTypeArguments().length == 0 ? BasicProfile.class : superClass.getActualTypeArguments()[0]); 
    } 

    protected final Class<T[]> getSuperClassArray() { 
     ParameterizedType superClass = (ParameterizedType)this.getClass().getGenericSuperclass(); 
     return (Class<T[]>)(superClass.getActualTypeArguments().length == 0 ? BasicMojangProfile[].class : superClass.getActualTypeArguments()); 
    } 

    public void doWork() { // This Works 
     String jsonText = "{id=3, name=Derp}"; 
     T result = new Gson().fromJson(jsonText, this.getSuperClass()); 
     // Will be whatever T is (defined elsewhere), unless this class 
     // is created without a super class then properly defaults to 
     // the BasicProfile 
    } 

    public void doArrayWork() { // DOES NOT WORK 
     String jsonText = "[{id=3, name=Derp}]"; 
     T[] result = new Gson().fromJson(jsonText, ?); 
     // Have tried the following (in place of the ?): 
     // new TypeToken<T>(){}.getType() 
     // new TypeToken<T[]>(){}.getType() 
     // new TypeToken<List<T>>(){}.getType() // with List<T> result 
     // this.getSuperClassArray() 
    } 

} 

Как я могу получить doArrayWork функционировать должным образом? Я не хочу передавать значение T в качестве параметра для метода.

ответ

2

Вы можете использовать Array.newInstance(this.getSuperClass(), 0).getClass().

Это создает массив на основе класса, переданного методу, а затем вызывает getCLass() на этом массиве, чтобы получить реальный объект класса, представляющий этот массив.

+1

Не могу поверить, как невероятно просто решение было ... tyvm –

Смежные вопросы