繁体   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