文章目录
- 解决 泛型类型转换出现`Unchecked cast: 'java.lang.Object' to 'T'`怎么解决
- 场景复现
- 如何解决
- 如何应用
- demo案例说明
解决 泛型类型转换出现Unchecked cast: 'java.lang.Object' to 'T'
怎么解决
场景复现
自定义工具类,编写公共方法,根据不同日期类型,将毫秒值转换对应的日期类型。Date
类型和LocalDatetime
类型强制转换泛型T,警告提示
Unchecked cast: 'java.util.Date' to 'T'
/**
* 毫秒值转换日期
* @param ms
* @return
*/
public static <T> T fromMsToDate(long ms, Class<T> clazz) {
if (ms == 0 || Objects.isNull(clazz)) {
throw new BusinessException("入参有误,请重新输入");
}
if (clazz == Date.class) {
Date date = new Date();
date.setTime(ms);
return (T) date;
} else if (clazz == LocalDateTime.class) {
LocalDateTime localDateTime = Instant.ofEpochMilli(ms).atZone(ZoneId.systemDefault()).toLocalDateTime();
return (T) localDateTime;
}
return null;
}
如何解决
在进行类型转换时,如果不确定转换后的类型,就会出现Unchecked cast: ‘java.lang.Object’ to 'T’的警告信息。为了避免这种警告信息,可以使用泛型边界进行限制。
如果要将一个Object类型的变量转换为指定的泛型类型T
/**
* @description 解决强制类型转换泛型警告问题
* @param obj 具体类型,object中子类
* @param clazz class
* @param <T> 泛型
* @return 转换泛型
*/
public static <T> T convert(Object obj, Class<T> clazz) {
if(clazz.isInstance(obj)) {
return clazz.cast(obj);
} else {
return null;
}
}
这个方法通过一个Class
类型的参数来确定泛型类型,并且使用clazz.cast(obj)
方法进行强制类型转换,避免了Unchecked cast
的警告信息。
如何应用
/**
* 毫秒值转换日期
* @param ms
* @return
*/
public static <T> T fromMsToDate(long ms, Class<T> clazz) {
if (ms == 0 || Objects.isNull(clazz)) {
throw new BusinessException("入参有误,请重新输入");
}
if (clazz == Date.class) {
Date date = new Date();
date.setTime(ms);
// return (T) date;
return convert(date, clazz);
} else if (clazz == LocalDateTime.class) {
LocalDateTime localDateTime = Instant.ofEpochMilli(ms).atZone(ZoneId.systemDefault()).toLocalDateTime();
// return (T) localDateTime;
return convert(localDateTime, clazz);
}
return null;
}
demo案例说明
Date date = DateUtil.fromMsToDate(1692414024609l, Date.class);
log.info("date : [{}]" , date);// 2023-8-19 11:0:24
LocalDateTime localDateTime = DateUtil.fromMsToDate(1692414024609l, LocalDateTime.class);
log.info("localDateTime : [{}]" , localDateTime); // 2023-8-19 11:0:24
21:16:29.967 [main] INFO com.geekmice.springbootselfexercise.NoDaoTest - date : [Sat Aug 19 11:00:24 CST 2023]
21:16:29.968 [main] INFO com.geekmice.springbootselfexercise.NoDaoTest - localDateTime : [2023-08-19T11:00:24.609]