有没有办法在泛型函数中将 List Object 转换为精确的 List Class ?

Is there a way to cast List Object into exact List Class in an generic function?

我正在 Spring 引导项目中编码,并且有很多 API 具有不同的请求参数,所以我正在尝试使用映射器将请求参数写入列表中的通用函数对象,然后像下面的代码一样将其转换为 class

    public static <D> List<D> convertStringListToObject(String string) {
        if (string == null) return null;
        try {
            return objectMapper.readValue(string, new TypeReference<>() {
            });
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return null;
    }

但结果是它只能 return Object 的列表而不是 D class 的列表,就像我期望的那样。有人知道如何编写此函数吗?

已编辑: 以下是我如何调用它:

filterBlockRequestDto.setPopularFiltersList(ApiUtil.convertStringListToObject(filterBlockRequestDto.getPopularFilters()));

FilterBlockRequestDto class

import lombok.*;

import java.util.List;

@Getter
@Setter
@Builder
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class FilterBlockRequestDto {
    Integer locationId;
    Integer projectId;
    String totalBudget;
    List<TotalBudgetDto> totalBudgetList;
    // The string was pass in Request param
    String popularFilters;
    List<PopularFiltersDto> popularFiltersList;
    Integer viewRating;
    Integer numberOfBed;
}

您还必须传递要反序列化字符串的类型..

我的做法是这样的:

public static <T> T convertStringListToObject(String string, Class<T> clazz) {
    if (string == null) {
        return null;
    }
    try {
       return objectMapper.readValue(string, clazz);
    } catch (JsonProcessingException e) {
       e.printStackTrace();
    }
    return null;
}

然后按如下方式使用此方法:

List<Model> models = 
    Arrays.asList(Mapper.convertStringListToObject(stringList, Model[].class));

一种方法是接受类型引用作为参数,以便调用者可以提供目标 class,并且由于 TypeReference 是一个子 class,通用类型信息将在运行时间。

    public static <D> List<D> convertStringListToObject(String string, TypeReference<List<D>> typeReference) {
        if (string == null) return null;
        try {
            return objectMapper.readValue(string, typeReference);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }