簡體   English   中英

GSON使用Java泛型

[英]GSON using Java generics

我正在嘗試使用GSON庫糾正稱為fromJSON的方法

public <T> T fromJSON( String object, Class<T> classObject )
{
    return gson.fromJson( object, classObject );
}

事實是我有一些類可以使用Java泛型定義一個成員。 例如,我可以創建一個new ValidationResult<User>(), ValidationResult<Image>() or ListResult<User>(), ListResult<Image>()等...,所以我面臨的問題是我需要告訴GSON應該使用哪個T。 這是我遇到問題的地方,因為我當前的代碼將JSON對象轉換為ValidationResultListResult ,但是該通用對象沒有被視為UserImage等。它只是轉換為LinkedTreeMap例如。

我嘗試了一些在Stackoverflow中找到的答案,但仍然無法正確解決。

與Gson一起使用通用類型
Google Gson-反序列化list <class>對象? (通用類型)
使用GSON反序列化通用類型

有人可以讓自己走對路嗎? 如有可能,請分享一些我可以用作指導的代碼。

由於類型擦除, ValidationResultValidationResult<User>是同一類型。 該類型將永遠只有一個Class對象。 由於Gson僅通過該Class對象知道ValidationResult ,因此它必須對默認類型使用默認值。 在這種情況下,它使用LinkedHashMap

最簡單的解決方案是提供TypeToken ,這是解決類型擦除的一種技巧(但並非如此)。 您可以像這樣使用

gson.fromJson(json, new TypeToken<ValidationResult<User>>() {}.getType());

通過Type ,Gson可以訪問泛型type參數。 注意我如何將類型User硬編碼為參數。 您必須在此處使用實際類型,Gson才能獲取實際類型。 如果您使用通用類型參數,Gson將獲得一個通用類型參數作為值,並且將再次不知道如何使用它。 在這里解釋為什么。

另一種解決方案是創建ValidationResult的子類型,例如

public class UserValidationResult extends ValidationResult<User> {}

並將其Class對象傳遞給您的方法。

暫無
暫無

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

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