Java中的通用方法,具有任意返回类型和Jackson序列化程序

时间:2015-02-16 11:09:06

标签: java json generics jackson

我使用Jackson + ES将JSON对象反序列化为java POJO。我使用一种简单的方法迭代ElasticSearch提供的SearchResponse:

private List<MyPOJO> toObjects(SearchResponse searchResponse)
{
    List<MyPOJO> _objects = new ArrayList<>();

    for(SearchHit searchHit: searchResponse.getHits().hits()){
        try {
            MyPOJO _object = json.readValue(searchHit.source(), MyPOJO.class);
            _objects.add(_object);
        } catch (IOException e){
            e.printStackTrace();
        }
    }

    return _objects;
} // ND: json is a Jackson ObjectMapper instance.

考虑到我为每个POJO重用了很多代码,我试图转换它以接受任意类型而不是固定的MyPOJO类型。 它可以用于Java吗?我搜索了Class&lt; ? &GT;泛型类型和T,但编译器总是给我错误。

1 个答案:

答案 0 :(得分:1)

您应该将Class<T>参数传递给toObjects函数

private <T> List<T> toObjects(SearchResponse searchResponse, Class<T> clazz)

并将clazz添加到readValue来电

T _object = json.readValue(searchHit.source(), clazz);

这是一种直截了当的方式。

如果真的必须在泛型(class ResponseReader<T>)上构建读者,可以通过反射来实现,但是你应该尽可能地避免这种方式,因为它会导致非常复杂和脆弱代码(和糟糕的表现)。