簡體   English   中英

Java,Gson,列表和泛型

[英]Java, Gson, Lists and Generics

只要不涉及列表,我就已經找到了解決該問題的方法,因此我很幸運,希望能做點什么。

我正在尋求使用泛型分解一些繁重的重復代碼。 我遇到麻煩的人可能與類型擦除有關。 首先,這是重復代碼的示例:

    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

有什么辦法解決這個問題? 坦率地說,我確實討厭不可重用的代碼。 謝謝 !

基本上,不能使用通用類型來創建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> ,后者不保存任何信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM