Jackson 的constructParametricType 已弃用,但constructParameterizedType 的工作方式不同

glf*_*eek 6 jackson

这是我的代码片段,较新的“constructParameterizedType”不符合我的需求(除非我遗漏了一些东西,我认为我是这样)。我有一个名为 Result 的泛化类,其中 T 是扩展我的“Inflatable”基类的任何基本类。代表从 Salesforce REST API 返回的数据记录......所以这里是工作的代码示例:

Class c = Class.forName("sfshare.UserRecord" );
JavaType type = mapper.getTypeFactory().constructParametricType(Result.class, c);
Result<T> res = mapper.readValue(rspData, type);
Run Code Online (Sandbox Code Playgroud)

但是如果我使用较新的(非弃用)“constructParameterizedType()”方法,同样的代码将无法编译,因为它与constructParameterizedType 的参数不匹配。但是constructParameterizedType 还没有被广泛使用,也没有例子可以使用……只有Javadoc——这对我的用例没有意义。

Sta*_*Man 7

如果您查看参数,特别是 Javadocs,您会注意到有一个新类型:第二个参数是参数的预期“目标”。举个例子的意思是,如果你想构造等价的:

ArrayList<String>
Run Code Online (Sandbox Code Playgroud)

你想作为参数传递的是:

constructParameterizedType(ArrayList.class, List.class, String.class)
Run Code Online (Sandbox Code Playgroud)

或者,可能,Collection.class对于第二个论点。将其视为您尝试为其提供参数的基础相关类型。

这种变化的根本原因有些复杂,与处理“附加”接口有关,例如Iterable<T>:对于这些情况,必须提供不同的类。

但在大多数最终用户用例中,您只需要传递与第一个和第二个参数相同的类。