Java,Gson,Lists和Generics

时间:2016-08-15 16:53:54

标签: java list generics gson

我已经看到了这个问题的一些解决方案,只要不涉及列表,所以我正在推动我的运气,看看能否做到。

我希望使用泛型来分解一些重复的代码。我有麻烦谁可能与类型擦除有关。首先,这里是重复代码的示例:

    private void readsFoo() throws Exception {
    JsonArray jsonArray = getJsonArray(foo_field);

    Type listType = new TypeToken<List<Foo>>() {
    }.getType();

    List<Foo> fooList= gson.fromJson(jsonArray, listType);

    for (Foo foo : fooList) {
        .....
    }
}

private void readsGoo() throws Exception {
    JsonArray jsonArray = getJsonArray(goo_field);

    Type listType = new TypeToken<List<Goo>>() {
    }.getType();

    List<Goo> gooList= gson.fromJson(jsonArray, listType);

    for (Goo goo : gooList) {
        .....
    }
}

现在,这是我自己制作的代码:

private void readsFoo() throws Exception {
    JsonArray jsonArray = getJsonArray(foo_field);
    List<Foo> fooList = getElementsList(jsonArray);

    for (Foo foo: fooList ) {
       .....
    }
}

private <T> List<T> getElementsList(JsonArray iArray)
{
    Type listType = new TypeToken<List<T>>() {}.getType();
    validateJsonElement(listType, "In getElementsList: Unable to find field TypeTokens");

    List<T> list = gson.fromJson(iArray, listType);
    validateJsonElement(list, "In getElementsList: Unable to find list from Json");

    return list;
}

在运行时,我收到以下错误:java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap无法强制转换为.... json.Foo

有什么方法可以解决这个问题吗?因为坦率地说我讨厌不可重用的代码。 谢谢!

1 个答案:

答案 0 :(得分:0)

基本上,TypeToken不能使用泛型类型。您可以将其作为参数传递:

private void readsFoo() throws Exception {
    JsonArray jsonArray = getJsonArray(foo_field);
    List<Foo> fooList = getElementsList(jsonArray, new TypeToken<List<Foo>>(){});

    for (Foo foo: fooList ) {
       .....
    }
}

private <T> List<T> getElementsList(JsonArray iArray, TypeToken<List<T>> tt)
{
    Type listType = tt.getType();
    validateJsonElement(listType, "In getElementsList: Unable to find field TypeTokens");

    List<T> list = gson.fromJson(iArray, listType);
    validateJsonElement(list, "In getElementsList: Unable to find list from Json");

    return list;
}

你对删除是正确的。由于T已被删除,因此您创建的TypeToken将保留List<T>类型,而不是List<Foo>,但不包含任何信息。