键入擦除,在参数中传递Class

时间:2011-12-11 21:29:01

标签: java generics type-erasure

我打电话的时候:

ArrayList<MyType> myobject = new Gson().fromJson(data, new TypeToken<ArrayList<T>>(){}.getType());

一切正常,使用fromJson(String, Type)
我打电话的时候:

ArrayList<MyType> myobject = helper(data);

public ArrayList<MyType> helper(String data){
    return new Gson().fromJson(data, new TypeToken<ArrayList<MyType>>(){}.getType());
}

它仍然可以正常工作,但是当我打电话时:

ArrayList<MyType> myobject = helper(data, MyType.class);

public <T> ArrayList<T> helper(String data, Class<T> type){
    return new Gson().fromJson(data, new TypeToken<ArrayList<T>>(){}.getType());
}

类型参数不合适 如何修复最后一段代码?

正如@LewsTherin所提议的那样,我只是给出来自来电者的确切类型参数 所以帮助声明是这样的:

public <T> ArrayList<T> helper(String data, Type type){
    ArrayList<T> rtn = g.fromJson(data, type);
    return rtn;
}

并打电话:

variable = helper(data, new TypeToken<ArrayList<MyType>>(){}.getType());

但如果有人可以编辑帮助函数来简化代码,我肯定会将其标记为正确!

2 个答案:

答案 0 :(得分:1)

如果您在辅助函数中使用,我认为它不会起作用。解决方案可能是从调用方法传递类型。所以很明显发生了什么。

return new Gson().fromJson(data, new TypeToken<ArrayList<T>>(){}.getType());

这实际上并没有指定对象类类型。那为什么它不起作用?

答案 1 :(得分:1)

你可以解决这个问题的一种方法是从GSON解析你自己的列表:

private <S> List<S> readFromJson(Reader input, Class<S> type) {
    JsonParser parser = new JsonParser();
    JsonElement element = parser.parse(input);
    ImmutableList.Builder<S> builder = ImmutableList.builder();
    for (JsonElement jsonElement : element.getAsJsonArray()) {
        builder.add(fromJson(jsonElement));
    }
    return builder.build();
}

private <S> S fromJson(JsonElement jsonElement, Class<S> type) {
    return configReader.fromJson(jsonElement, type);
}

此外,GSON文档有一个类似于您要完成的示例:https://sites.google.com/site/gson/gson-user-guide#TOC-InstanceCreator-for-a-Parameterized