提问者:小点点

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


例如:为什么不:

Foo结果=mapper. readValue

而不是

Foo结果=mapper. readValue(jsonStr,Foo.class);

阻止Java泛型使用它的限制是什么?


共1个答案

匿名用户

限制是无法从类型变量中选择。所以你不能调用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);
}

他们需要将value eType传递给

_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
}

这将成功编译。

如何从泛型类型参数中获取“. class”属性?