解决 泛型类型转换出现Unchecked cast: ‘java.lang.Object‘ to ‘T‘怎么解决

文章目录

  • 解决 泛型类型转换出现`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'

image-20230822210931990

/**
 * 毫秒值转换日期
 * @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  泛型
 * @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的警告信息。

如何应用

解决 泛型类型转换出现Unchecked cast: ‘java.lang.Object‘ to ‘T‘怎么解决_第1张图片

/**
 * 毫秒值转换日期
 * @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]

image-20230822211711635

你可能感兴趣的:(问题汇总,java,python,开发语言)