2

私はリファクタリングしているこのコードを持っています:

    if (response != null) {
        Type collectionType = new TypeToken<List<GameInfo>>() {}.getType();
        Gson gson = new Gson();
        return (List<GameInfo>) gson.fromJson(response, collectionType);
    }

「リスト」部分が任意のコレクションタイプである関数を作成できますか?

違法コードの例:

private <T> T collectionFromJson(String pResponseJson, Class<T> pCollectionClass) {
    T result = null;
    Type collectionType = new TypeToken<pCollectionClass>() {
    }.getType();
    ...
    return result;
}

私が狙っているものを説明する違法なコードへの違法な呼び出しの例:

return collectionFromJson(response, List<GameInfo>.class);
4

1 に答える 1

2

Class<T>引数を使用してこれを行うことはできません。これは、次のClassような生の型の表現のみをサポートしているためです。List型はオブジェクトでList<GameInfo>表現できないため、存在します。ClassTypeToken

メソッドはTypeToken<T>代わりに引数を取り、その引数を作成するのは呼び出し元に任せる必要があります。

private <T extends Collection<U>, U> T collectionFromJson(String pResponseJson, TypeToken<T> typeToken) {
    return (T)new Gson().fromJson(pResponseJson, typeToken.getType());
}

...

TypeToken<List<GameInfo>> typeToken = new TypeToken<List<GameInfo>>() { };
List<GameInfo> lst = collectionFromJson(response, typeToken);

(免責事項:私はJava /ジェネリックの経験しかなく、GSONの経験はありません)

于 2012-05-14T16:52:19.077 に答える