java - 从java中的类型创建ArrayList

标签 java class reflection arraylist

为什么这是不可能的?

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

返回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:"sachin@example.com",
         email:"sachin@example.com",
         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:"admin@admin.com",
         created_on:"1268889823",
         last_login:"1425373557",
         active:"1",
         first_name:"Admin",
         last_name:"istrator",
         company:"ADMIN",
         phone:"0",
         sign_up_mode:"SOMEAPP"
      }
   ]
}

最佳答案

抱歉,我没有足够的声誉来发表评论。

您必须在编译时而不是运行时知道类型。这就是为什么它无法解决。看看这个链接:http://docs.oracle.com/javase/tutorial/java/generics/erasure.html

关于java - 从java中的类型创建ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29164224/

相关文章:

java - 如何停止悬吊线程池中的多个线程执行同一条语句?

java - 从另一个类中清除 TextField

java - 如何创建带有 Android 事件的 "manager class"?

c# - GetType() 是方法还是类?

Java Reflection - 访问字段的字段

java - 如何更改 zhanghai 的 MaterialRatingBar 库中星星的颜色我找不到办法做到这一点?

java - infinispan 作为二级缓存 hibernate

c++ - 将 unicode 字符串转换为字符串

python:使用一个类来跟踪另一个类使用的数据

c# - 使用反射查找通用方法时发现模糊匹配