有没有办法在泛型函数中将 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;
}
我正在 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;
}