嵌套泛型参数作为方法参数 - Java

时间:2016-01-07 23:13:29

标签: java generics jackson java-8

基于这个问题https://developer.ibm.com/mobilefirstplatform/2015/08/03/integrating-3rd-party-cordova-plug-ins/我实现了以下类:

public class OkJsonConverter<T> {

    final Class<T> typeParameterClass;

    public OkJsonConverter(Class<T> typeParameterClass) {
        this.typeParameterClass = typeParameterClass;
    }

    protected T processJson(String json) throws OkClientException {
        T object = null;
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            JsonNode jsonNode = objectMapper.readTree(json);

            if (jsonNode.get("error_code") != null) {
                Error error = objectMapper.treeToValue(jsonNode, Error.class);
                throw new OkClientException("API returned error", error);
            } else {
                object = objectMapper.treeToValue(jsonNode, typeParameterClass);
            }
        } catch (IOException e) {
            throw new OkClientException("unable to process json", e);
        }
        return object;
    }

}

我可以将此类与通用参数一起使用,例如:

return new OkJsonConverter<User>(User.class).processJson(response.getBody());

但是现在我正在努力如何使用嵌套的通用参数,例如List<Method>

此代码不起作用:

 return new OkJsonConverter<List<Method>>(List<Method>.class).processJson(response.getBody());

请帮助更改此代码以使其正常运行。

2 个答案:

答案 0 :(得分:4)

Java没有办法将该类型表示为Class。你可以得到的最接近的近似值是(Class<List<Method>>) (Class) List.class,但这只会引发一些论文,而你只是在看一个不知道其元素类型的基本List

是否适用于您的JSON转换器并不清楚,但应在您正在使用的转换器的文档中指定,这将自行处理,因为这是一个通用的当你试图反思泛型类型时,Java中的问题。

答案 1 :(得分:0)

最后,感谢user3707125我找到了实现这个目标的方法:

idierL

更正
public class OkJsonConverter {

private static final String ERROR_CODE_FIELD_NAME = "error_code";

protected <T> T readTreeToValue(String json, TypeReference<T> valueTypeRef) throws OkClientException {
    T object = null;

    ObjectMapper objectMapper = new ObjectMapper();
    try {
        JsonNode jsonNode = objectMapper.readTree(json);

        if (jsonNode.has(ERROR_CODE_FIELD_NAME)) {
            Error error = objectMapper.treeToValue(jsonNode, Error.class);
            throw new OkClientException("Ok API returned error", error);
        } else {
            JavaType type = objectMapper.getTypeFactory().constructType(valueTypeRef);
            object = objectMapper.convertValue(jsonNode, type);
        }
    } catch (IOException e) {
        throw new OkClientException("Unable to process JSON", e);
    }

    return object;
}

}

现在,以下代码可以正常工作:

List<Method> result = new OkJsonConverter().readTreeToValue(response.getBody(), new TypeReference<List<Method>>() {});