2015-03-20 2 views
1

Почему это невозможно?create ArrrayList from Type in java

Type type = newResponse.getDataType().getType(); 
Class<?> tClass = type.getClass();     
Type arrayType = new TypeToken<ArrayList<tClass>>(){}.getType(); 

Полная десериализатор выглядит следующим образом -

public class NewJsonDesrializer implements JsonDeserializer<NewResponse> { 

    @Override 
    public NewResponse deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) 
      throws JsonParseException { 

     JsonObject jsonElement = json.getAsJsonObject(); 
     NewResponse newResponse = new Gson().fromJson(json, typeOfT); 
     JsonElement data = jsonElement.get("data"); 

     if(data.isJsonArray()){ 
      Type type = newResponse.getDataType().getType(); 
      Class<?> tClass = type.getClass(); 

      Type arrayType = new TypeToken<ArrayList<tClass>>(){}.getType(); 

      newResponse.setData(new Gson().fromJson(data, arrayType)); 


     }else{ 
      newResponse.setData(new Gson().fromJson(data, newResponse.getDataType().getType())); 
     } 


     return newResponse; 
    } 
} 

Это бросает ошибку в десериализатор выше в строке -

Error:(36, 54) error: cannot find symbol class tClass 

Полный класс NewResponse является следующим образом-

public class NewResponse<T> implements Serializable { 
    private boolean status; 
    private String message; 
    private T data; 
    private Constants.DataType dataType; 

    public boolean isStatus() { 
     return status; 
    } 

    public void setStatus(boolean status) { 
     this.status = status; 
    } 

    public String getMessage() { 
     return message; 
    } 

    public void setMessage(String message) { 
     this.message = message; 
    } 

    public T getData() { 
     return data; 
    } 

    public void setData(T data) { 
     this.data = data; 
    } 

    public Constants.DataType getDataType() { 
     return dataType; 
    } 

    public void setDataType(Constants.DataType dataType) { 
     this.dataType = dataType; 
    } 
} 

Перечислим, что r eturns Type выглядит следующим образом -

public enum DataType{ 
     @SerializedName("user") 
     USER(User.class); 

     Type type; 

     DataType(Type type) { 
      this.type = type; 
     } 

     public Type getType(){ 
      return type; 
     } 
    } 

Json структура выглядит следующим образом -

{ 
    status:true, 
    message:"Registration Complete.", 
    dataType:"user", 
    data:[ 
     { 
     username:"[email protected]", 
     email:"[email protected]", 
     created_on:"1426663448", 
     last_login:null, 
     active:"1", 
     first_name:"Sachin Gutte", 
     last_name:"", 
     company:null, 
     phone:null, 
     sign_up_mode:"GOOGLE_PLUS" 
     }, 
     { 
     username:"administrator", 
     email:"[email protected]", 
     created_on:"1268889823", 
     last_login:"1425373557", 
     active:"1", 
     first_name:"Admin", 
     last_name:"istrator", 
     company:"ADMIN", 
     phone:"0", 
     sign_up_mode:"SOMEAPP" 
     } 
    ] 
} 
+2

Вы можете указывать типы параметров типа напрямую, а не косвенно через переменную. Но поскольку параметры типа в Java не сохраняются во время выполнения (во время выполнения List не знает, является ли это списком Integer или что-то еще), зачем вам нужно указывать его через переменную? –

+0

@ErwinBolwidt Я использую Gson для анализа данных. Код является частью десериализатора. Jsone иногда возвращает один объект или список различных типов классов, то есть модели, которые я имею. Будет обновлен вопрос с подробностями. – SachinGutte

+0

@ErwinBolwidt См. Обновленный вопрос. Json, о котором идет речь, также публикуется. – SachinGutte

ответ

1

К сожалению, у меня не хватает репутации комментировать.

Вы должны знать тип, компилируя время, а не время выполнения. Вот почему это невозможно решить. Посмотрите на эту ссылку: http://docs.oracle.com/javase/tutorial/java/generics/erasure.html

+0

смотрите обновленный вопрос. Может быть, теперь ты сможешь помочь. :) – SachinGutte