题目描述
之前写力扣就用的 List<String> re = new ArrayList<String>();这个语句,也明白说ArrayList向上转型成了List类型,re说一个List类型,不过今天进行写的时候发现了两句话无法run,想求大家看看为什么,谢谢了
相关代码
List<List> re2 = new ArrayList<ArrayList>();
HashMap<String, List> re3 = new HashMap<String, ArrayList>();
你期待的结果是什么?实际看到的错误信息又是什么?
上面两句都显示java: 不兼容的类型:。。。
有点不太明白向上转型是需要什么情况吗,比较困惑,真的不知道为什么会这样,后面我是把List全改成了ArrayList,也能通过,但是真的不知道为什么上面会不兼容。
这个是 Java 在编译时的类型擦除导致的类型不安全。
Java 的泛型在编译时会全部被擦除,假设你相关代码可以编译通过:
以
re2
为例,对于List<List>
来说,执行re2.add(new LinkedList<>())
对于其定义来说是没有问题的且允许的,但实际上re2
的实现是ArrayList<ArrayList>
,这样就会导致出现类型转换错误,因为LinkedList
是不可以强转成ArrayList
的,为了避免发生这种意外情况,Java 在编译阶段直接就不允许这样的用法。