类型转换,异常排查java.lang.ClassCastException: java.util.HashMap$Node cannot be cast to java.lang.String

一次集合构造方法泛型省略引起的特殊的异常:
java.lang.ClassCastException: java.util.HashMap$Node cannot be cast to java.lang.String
这个异常意思是把map类型转string失败,map类型不能转string类型
在这里插入图片描述
当时非常疑惑,在for循环处抛异常,而非空判断又没什么问题,很奇怪,而且参数就是个List类型啊,List中肯定是String,可报错的原因看,List中的元素是Map类型,这就奇怪了,于是查看上层调用
原来是构造List时候,传参传的是一个map的entrySet,而Set列表中的元素是Map类型,所以问题就出在这里

源码分析

我们看下源码 new ArrayList(…)构造方法,为何编译没有报错
由下面源码我们知道,参数是一个Collection集合类型,而集合中的具体元素类型是和泛型E一致的,而泛型E是在构造方法时候指定的, List urls = new ArrayList(set);
在这里插入图片描述

指定泛型才会出现编译异常

在这里插入图片描述

为何List 没在编译期起作用

List urls = new ArrayList(set); 前面是的 List urls 是引用,指向的具体的对象 new ArrayList(set); 具体集合中的单个对象能不能转成引用中指定的泛型,只有在类型转换的时候才会出现,那么什么时候会类型转换呢?真正使用的时候,比如for循环,就是真正使用的时候
for循环 相当于是 使用强制类型转换

总结

为了避免类似可能代码编写疏忽引起同类型的问题,,建议构造方法不要省略泛型书写

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值