我正在使用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 泛型和T,但是编译器总是给我错误。

最佳答案

您应该将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>)上构建阅读器,则可以通过反射进行,但是您应尽可能避免这种方式,因为这会导致非常复杂和脆弱的代码(以及不良的性能)。

08-06 04:19