首页 > 解决方案 > 如何上课> 没有 List 的实例?

问题描述

我以前在 Java 中做过这个,但无法访问执行它的源代码,我也不记得最初让我得到答案的搜索短语!

我有一个需要如下工作的方法..

public <T> List<T> get(String json) {
 return JsonSerializer.deserialize(json, Class<List<T>>);
}

我似乎找到的每个答案总是假设我有一个 List 对象,然后我可以使用反射,但在我的情况下我没有。有任何想法吗?

标签: java

解决方案


您在这里有两个单独的问题。

发布第一个:<T>您签名中的 完全消除。因此,您想要的(让代码编写,比如说,List<Integer> x = get(someJsonHere);采用“嘿,此代码明确需要一个 INTEGERS 列表,并在运行时使用它来反序列化 json”的概念是不可能的,因为该信息在运行时不存在。唯一的方式是 API 将是,例如:List<Integer> x = getListOf(Integer.class, someJsonHere)List<Integer> x = getIntList(someJsonHere).

发出第二个:

出于与上述相同的原因,json 反序列化器也不知道该做什么。java.lang.Class实例代表类,而不是它们之后的泛型;用 java.lang.Class 对象表示“字符串列表”的想法是不可能的。只有“一个列表”。

因此,就像您提出的 API 不起作用一样,无论“JsonDeserializer”在这里是什么,它的作者都做了一些根本没有破坏的东西,因此为您提供了一种方法来告诉它您想要一个整数或字符串列表或诸如此类的东西.

常见的方法有3种:

[1] 传递其字段已泛化的非泛型类型,因此:

public class YourThing {
    List<String> listOfStrings;
}

并通过YourThing.class

[2] 更多参数!

JsonDeserializer.deserialize(yourJson, List.class, String.class);

[3] 超类型令牌。看起来很时髦,但这是合法的java:

JsonDeserializer.deserialize(yourJson, new JsonDeserializerType<List<String>>() {}); // Note the trailing {}. Required.

检查 json 反序列化器的文档;它会告诉你它提供了哪些策略以及如何具体使用它。


推荐阅读