一次集合构造方法泛型省略引起的特殊的异常:
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循环 相当于是 使用强制类型转换
总结
为了避免类似可能代码编写疏忽引起同类型的问题,,建议构造方法不要省略泛型书写