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

解决 泛型类型转换出现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 <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的警告信息。

如何应用

image-20230822211453255

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值