Java 如何上课<;列表<;T>&燃气轮机;没有列表的实例<;T>;?

Java 如何上课<;列表<;T>&燃气轮机;没有列表的实例<;T>;?,java,Java,我以前用Java做过这个,但是没有访问过做这个的源代码,也不记得最初得到答案的搜索短语 我有一个方法需要像下面这样工作 公共列表获取(字符串json){ 返回JsonSerializer.deserialize(json,类); } 我找到的每一个答案总是假设我有一个列表对象,然后我可以使用它进行反射,但在我的情况下,我没有。有什么想法吗?在这种情况下,您可以忽略泛型,使用List.class,它就可以正常工作了 ObjectMapper objectMapper = new ObjectMa

我以前用Java做过这个,但是没有访问过做这个的源代码,也不记得最初得到答案的搜索短语

我有一个方法需要像下面这样工作

公共列表获取(字符串json){ 返回JsonSerializer.deserialize(json,类); }
我找到的每一个答案总是假设我有一个列表对象,然后我可以使用它进行反射,但在我的情况下,我没有。有什么想法吗?

在这种情况下,您可以忽略泛型,使用
List.class
,它就可以正常工作了

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModules(new JavaTimeModule());
objectMapper.enableDefaultTyping();
ObjectReader reader = objectMapper.reader();
List<T> data = (List<T>)(objectReader.forType(List.class).readValue(s));
ObjectMapper ObjectMapper=new ObjectMapper();
registerModules(新的JavaTimeModule());
objectMapper.enableDefaultTyping();
ObjectReader=objectMapper.reader();
列表数据=(列表)(objectReader.forType(List.class.readValue));

这里有两个单独的问题

第一个问题:签名中的
已完全消除。因此,您需要(让代码编写,比如,
List x=get(someJsonHere)
采用“嘿,这段代码明确需要一个整数列表,并在运行时使用它来反序列化json”的概念是不可能的,因为运行时不存在该信息。唯一的方法是API应该是,例如:
list x=getListOf(Integer.class,someJsonHere)
list x=getIntList(somejson此处)

第二期:

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

因此,就像您提出的API不起作用一样,不管这里有什么“JsonDeserializer”,它的作者做了一些没有根本性破坏的东西,因此提供了一种方法来告诉它您想要一个整数或字符串列表,或者其他什么

有三种常见的方法:

[1] 传递字段已泛化的非泛型类型,以便:

public class YourThing {
    List<String> listOfStrings;
}
[3] 超级类型令牌。看起来很时髦,但这是合法的java:

JsonDeserializer.deserialize(yourJson, new JsonDeserializerType<List<String>>() {}); // Note the trailing {}. Required.
JsonDeserializer.deserialize(yourJson,newJSONDESerializerType(){});//注意后面的{}.Required。

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

您不能使用
List.class
?您的意思是
List.class
?不,这不会向反序列化程序提供有关其试图反序列化的对象的任何类型信息。
List
不会携带不管怎样,在运行时都是y类型信息。@MarkCesnik可能这就是您要寻找的?我的意思是,在方法运行时不会进行类型安全验证,因为泛型通常会确保是验证类型安全的最新时间。但是,这种类型安全性无法用所需的方法签名进行验证。这不适用于rk。序列化程序必须知道类T,这样才能正确地将json数组反序列化为实际对象列表。这样做可以创建一个映射对象列表。您使用什么反序列化程序?如果切换到json Jackson库,它会工作。我用代码示例更新了答案您的示例创建了一个非类型的HashMap列表是的,它确实进行了反序列化,但当我尝试访问数据时,它死掉得很厉害。我只是用
objectMapper.enableDefaultTyping();
这行代码更新了我的答案,看看它是否有助于Hanks@rzwitserloot最终使用解决方案2。
JsonDeserializer.deserialize(yourJson, new JsonDeserializerType<List<String>>() {}); // Note the trailing {}. Required.