下面的代码工作正常。
List<Integer> arr = new ArrayList<Integer>();
System.out.println(arr.getClass().getSimpleName()); // output: ArrayList
arr.add(0);
arr.add(1);
arr = arr.subList(0,1);但是如果您将第一行更改为
var arr = new ArrayList<Integer>();将发生以下错误:
java:不兼容类型: java.util.List不能转换为java.util.ArrayList
然而,即使arr是用第二种方式定义的,它的类型仍然是ArrayList,那么有什么区别呢?
发布于 2022-01-30 07:40:26
当你写
var arr = new ArrayList<Integer>();编译器推断arr变量的类型为ArrayList<Integer>,因此它相当于写入:
ArrayList<Integer> arr = new ArrayList<Integer>();arr.subList(0,1)返回不能分配给ArrayList<Integer>的List<Integer>,因为ArrayList<Integer>是List<Integer>的实现,但并不是List<Integer>的所有实现都是ArrayList<Integer>。
另一方面,当您将变量声明为List<Integer> arr时,可以为它分配List<Integer>的任何实现,其中包括arr.subList(0,1)返回的值。
需要注意的是,subList做而不是返回ArrayList。例如,subList()方法ArrayList返回一个名为ArrayList$SubList的内部类的实例。这样的List不能分配给类型为ArrayList的变量。
https://stackoverflow.com/questions/70912743
复制相似问题