我正在使用Jackson AutoMapper通过TypReference将值从SON映射到List MyPojo,就像这样 1.

List<MyPojo> myList= objectMapper.readValue("...json value...", new TypeReference<List<MyPojo>>() {});

但我有几个问题. 我知道TypReference用于捕获通用类型并在运行时保留它,否则我们将因为类型擦除而丢失该信息.但后来我得到警告:

"显式类型参数列表可以替换为"

所以我try 了这个: 二:

List<MyPojo> myList= objectMapper.readValue("...json value...", new TypeReference<>() {});

再说一遍,一切正常,但我想知道这是否是一个有效的警告,因为对象Mapper实际上需要知道要映射到哪个类型? 所以我同时运行.readValue(.)调试器中的方法以查看返回值是多少.第一个方法调用返回MyPojo的ArrayList,这确实是预期的,但第二个方法调用返回linkedHashMap的ArrayList.这也是意料之中的,因为Jackson默认会映射到LinkedIn HashMap,但我不明白如何可以简单地将LinkedIn HashMap的ArrayList分配给MyPojo的List,因为编译器不允许我在没有某种转换的情况下手动这样做?

推荐答案

这是一个有效的警告.使用<>意味着:"嘿,编译器?你能弄清楚我想在这里写什么吗?只有一件明显的事情可以起作用,所以请假设我写了这句话".换句话说,it is identical to writing it out longform - if编译器可以为您解决这个问题.

It can在这里为您解决问题:因为您将其直接分配给类型List<MyPojo>的变量,所以编译器知道只有TypeReference<List<MyPojo>>可以在这里工作.

与用System.out.println(EXPR);替换List<MyPojo> list = EXPR;相反--现在是编译器would not know,因此如果您使用<>,那么编译器所能做的就是使用Object(因为这是它可以生成的限制最少的仍然有效的内容.它有效,因为存在System.out.println(Object)).现在,在运行时,对象Mapper使用反射来判断TypReference匿名内部类文字的<>中的内容,找到Object,因此不知道如何通过创建新的MyPojo实例来转换输入中的{foo: bar}-没有人告诉它关于MyPojo,所以now它会失败.

换句话说,您可以从上下文中省略<>中的内容(但不是<>本身)ifcompiler可以找出<>中应该有什么.是否可以取决于您如何使用它.指定字段/参数-通常是的.传递给方法-有时,取决于存在多少过载.传递到System.out.println这样的广义内容?那么不--你必须明确地写出来.

如果在其中一种"必须写出来"的场景中仍然出现警告,则then即为错误警告.

请注意,supertypetokens(这就是TypeReference的意思)是一个有点奇怪的黑客.Linters在这里搞砸是有道理的(比如告诉你<List<MyPojo>>可以用<>替换-那是一个Linting工具,javac本身并不关心你如何做).

只是在这个specific case 中,警告是公平的,你所做的也是好的.但在其他情况下,您无法用<>替换<List<MyPojo>>.

Java相关问答推荐

如果一个子类没有构造函数,超类也没有构造函数,那么为什么我可以构造子类的实例呢?

Intellij显示项目语言级别最高为12,尽管有java版本17 SDK

Java 21 struct 化连接货币,需要可预知的子任务异常排序

为什么S的文档中说常量方法句柄不能在类的常量池中表示?

Bean定义不是从Spring ApplationConext.xml文件加载的

测试容器无法加载类路径初始化脚本

如何为JavaFX Spring Boot应用程序制作Windows/MacOS/Linux安装程序

Groovy/Java:匹配带引号的命令选项

Spring Validator批注不起作用

组合连接以从两个表返回数据

使IntelliJ在导入时优先 Select 一个类或将另一个标记为错误

在Java泛型中使用通配符时,如何推断类型

如何从命令行编译包中的所有类?

Android无法在Java代码中调用Kotlin代码,原因是在Companion中使用Kotlin枚举时

JPA无手术同品种器械可能吗?

整数->;双取消框,但双->;int不';t开箱.为什么?

如何使用带有可选参数的类生成器?

java.lang.NoSuchMethodError:';org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream$Builder org.apache.poi-poi-ooxml-5.2.4

java21预览未命名的符号用于try-with-resources

带有提取器的JavaFXObservableList会根据侦听器的存在而改变行为