【问题标题】:Java Generics, Create an instance of Class<T>Java 泛型,创建 Class<T> 的实例
【发布时间】:2023-04-01 18:01:01
【问题描述】:

我正在尝试编写一个将 json 反序列化到我的模型中的通用方法。我的问题是我不知道如何从泛型类型 T 中获取 Class。我的代码看起来像这样(并且不以这种方式编译)

public class JsonHelper {

    public <T> T Deserialize(String json)
    {
        Gson gson = new Gson();

        return gson.fromJson(json, Class<T>);
    }
}

我尝试了其他方法来获取类型,但它抛出了一个错误我将类设置为JsonHelper&lt;T&gt; 然后尝试了这个

Class<T> persistentClass = (Class<T>) ((ParameterizedType)getClass()
    .getGenericSuperclass())
    .getActualTypeArguments()[0];

方法签名是这样的

com.google.gson.Gson.fromJson(String json, Class<T> classOfT)

那么,如何沿 T 进行翻译,以便在调用 JsonHelper.Deserialize&lt;MyObject&gt;(json); 时获得正确对象的实例?

【问题讨论】:

  • 我不确定这是否可能。如果是,为什么 GSon 类不直接执行并远程调用 Class 参数?
  • 乔希,我搜索并回答了同样的问题,但从未找到。我最终做了以下两个答案的建议。

标签: java class generics types


【解决方案1】:

您需要从某个地方获取Class 实例。也就是说,您的Deserialize() 方法需要将Class&lt;T&gt; 作为参数,就像底层的fromJson() 方法一样。

您的方法签名应该类似于 Gson 的:

<T> T Deserialize(String json, Class<T> type) ...

您的电话将如下所示:

MyObject obj = helper.Deserialize(json, MyObject.class);

顺便说一句,在 Java 中以小写字母开头的方法名称的约定已经很成熟了。

【讨论】:

  • 我主要来自 .net 的背景,这就是我学习编码实践的地方。 :)
  • @Josh:当然,如果来自另一种语言的人开始使用他们习惯的风格,这是可以理解的。也就是说,最好学习并尝试使您的代码样式与您所使用的语言的标准保持一致。
【解决方案2】:

不幸的是,Java 处理泛型的方式,您无法获得您所要求的类。这就是为什么谷歌的东西专门要求这个类作为论据。你必须修改你的方法签名来做同样的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    相关资源
    最近更新 更多