【问题标题】:Is there a way to cast List Object into exact List Class in an generic function?有没有办法在泛型函数中将 List Object 转换为精确的 List Class?
【发布时间】:2021-04-23 10:16:14
【问题描述】:

我在 Spring Boot 项目中进行编码,并且有很多 API 具有不同的请求参数,所以我尝试使用映射器将请求参数写入列表对象的通用函数,然后将其转换为类似的类代码如下

    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;
    }

但结果是它只能返回一个 Object 列表,而不是我预期的 D 类列表。有没有人知道如何编写这个函数?

编辑: 这是我调用它的方式:

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

FilterBlockRequestDto 类

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;
}

【问题讨论】:

  • 请说明你是如何调用它的。
  • 哦:new TypeReference&lt;&gt;() {} 不行。您需要传入一个TypeReference&lt;D&gt; 作为参数。
  • @AndyTurner 这是我调用它的方法filterBlockRequestDto.setPopularFiltersList(ApiUtil.convertStringListToObject(filterBlockRequestDto.getPopularFilters()));。我已经尝试像您之前所说的那样添加,但编译器和 IDE 一直在抱怨,所以我遵循建议,最终结果在函数之上。你可以给我一个传递类型 D 的例子吗?

标签: java spring-boot generics objectmapper


【解决方案1】:

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

    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;
    }

【讨论】:

    【解决方案2】:

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

    我的方法是这样的:

    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));
    

    【讨论】:

    • 它仍然是一个对象,而不是我想要的确切类
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 1970-01-01
    • 2021-08-05
    相关资源
    最近更新 更多