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

Generic method in Java with arbitary return type and Jackson serializer

我正在使用 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)

并添加 clazzreadValue 调用

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

这是一个简单的方法。

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