java - 为什么 Jackson,GSON...不使用泛型而是传递类对象来反序列化对象

标签 java generics

例如: 为什么不:

Foo result = mapper.readValue<Foo>(jsonStr);

而不是

Foo result = mapper.readValue(jsonStr, Foo.class);

Java 泛型有什么限制阻止他们使用它?

最佳答案

简短回答

这是 Java 泛型限制

限制是无法从类型变量中进行选择。因此,您无法调用 T.class 来获取下一个方法所需的 T 的类对象。

长答案

看一下实现

public <T> T readValue(String content, Class<T> valueType)
    throws IOException, JsonParseException, JsonMappingException
{
    return (T) _readMapAndClose(_jsonFactory.createParser(content), _typeFactory.constructType(valueType));
}

public JavaType constructType(Type type) {
    return _fromAny(null, type, EMPTY_BINDINGS);
}

他们需要传递valueType

_typeFactory.constructType(valueType)

这对于泛型来说是不可能的。

示例

我尝试过以下方法

private <T> T readValue(String content)
{
    return constructType(T.class);
}

private JavaType constructType(Type type)
{
    //construct type somehow
}

这不能编译。它显示 T 上的无法从类型变量中进行选择(第 3 行)。现在使用 Class 参数:

private <T> T readValue(String content, Class<T> clazz)
{
    return constructType(clazz);
}

private JavaType constructType(Type type)
{
    //construct type somehow
}

这将成功编译。

另请参阅

How do I get the `.class` attribute from a generic type parameter?

关于java - 为什么 Jackson,GSON...不使用泛型而是传递类对象来反序列化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49428088/

相关文章:

java - 实例化通用抽象类的子(具体)类,其构造函数需要其他参数类

java - NetworkOnMainThreadException TCP 连接 AsinkTask

c# - 无法隐式转换类型 System.Collections.Generic.IList System.Collections.Generic.List

java - 有没有办法在序列化之前拦截 Spring MVC RestController 端点的结果?

java - 为 JTextPane 边框创建自定义形状

.net - 为什么 ICollection<T> 不实现 ICollection?

java - 使用泛型和动态类类型返回类型转换

generics - 一种处理嵌入一个通用结构的所有结构类型的方法(json 编码)

java - java中的if语句帮助

java - 每个 Wicket 口 session 都有新 bean