【问题标题】:Get class type of generic class [duplicate]获取泛型类的类类型[重复]
【发布时间】:2015-11-20 13:26:09
【问题描述】:

我有以下方法,我正在尝试将其与一个通用类一起使用:

public static <T> T fromJson(String serializedJson, Class<T> theClazz);

我想反序列化一个如下所示的类:

public class JsonContentWrapper<T> {
    private String version;
    private T content;
}

我通常使用fromJson 方法的方式如下:

JsonUtil.fromJson(someJsonString, JsonContentWrapper.class)

但是,由于 JsonContentWrapper 具有通用对象 content,我真的很想能够这样做:

JsonUtil.fromJson(someJsonString, JsonContentWrapper<SomeClass>.class)

但这不起作用。有没有办法获得一个泛型类和它正在使用的泛型?我尝试过类似this 的方法,但运气不佳。

就目前而言,至少对于我正在测试的对象而言,T 对象正在反序列化为 LinkedHashMap,这是错误的。

【问题讨论】:

  • 因为我确信必须有另一种方法来解决这个问题,也许有人可以帮助解决这个问题。我不需要它来确定我的泛型是什么,我可以告诉它:“将其反序列化为这种类型,其中 T 是这个”
  • 您可以尝试在JsonContentWrapperClass - private Class&lt;T&gt; contentClass 中添加另一个字段。这样,您将在运行时拥有特定的类,并且可以使用它来相应地解析内容。不过,不确定它是否适用于您的情况。
  • 你可能想看看 gson 和它的 TypeToken 可以像 Map&lt;String, String&gt; map2 = gson.fromJson(json, new TypeToken&lt;Map&lt;String, String&gt;&gt;() {}.getType()); 一样使用

标签: java


【解决方案1】:

Java 使用Erasure 实现泛型。这意味着在运行时,JVM 无法知道哪些类型与 Generic 类/方法/对象/whatever 相关联。有一些技巧和变通方法可以用来尝试解决这个问题,但这是该语言的基本部分。

鉴于您正在使用 JSON,您可能希望调查该库是否具有专门用于通用数据结构的函数。我碰巧知道GSON has functions specific to handling Generic data structures.

【讨论】:

    【解决方案2】:

    ...我确信必须有另一种方法来解决这个问题,也许有人可以帮助解决这个问题。

    很遗憾,没有。

    您可以做的最好的事情是反序列化为JsonContentWrapper,然后进行不安全的类型转换以将结果转换为JsonContentWrapper&lt;SomeClass&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-13
      • 2019-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-19
      • 2014-03-29
      • 2019-01-20
      相关资源
      最近更新 更多