List<Integer> arr 和 var arr 之间的区别

Acu*_*zio 2 java containers sublist

下面的代码工作正常。

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);
Run Code Online (Sandbox Code Playgroud)

但是如果你将第一行更改为

var arr = new ArrayList<Integer>();
Run Code Online (Sandbox Code Playgroud)

会出现错误:

java: 不兼容的类型: java.util.List<java.lang.Integer> 无法转换为 java.util.ArrayList<java.lang.Integer>

然而,即使arr是用第二种方式定义的,它的类型仍然是ArrayList,那么有什么区别呢?

Era*_*ran 8

当你写的时候

var arr = new ArrayList<Integer>();
Run Code Online (Sandbox Code Playgroud)

编译器将变量的类型推断arrArrayList<Integer>,因此相当于编写:

ArrayList<Integer> arr = new ArrayList<Integer>();
Run Code Online (Sandbox Code Playgroud)

arr.subList(0,1)返回 a List<Integer>,它不能分配给 an ArrayList<Integer>,因为 anArrayList<Integer>是 的实现List<Integer>,但并非所有实现List<Integer>都是ArrayList<Integer>

另一方面,当您将变量声明为 时List<Integer> arr,您可以为其分配 的任何实现List<Integer>,其中包括 的返回值arr.subList(0,1)

需要注意的是,它subList不会返回ArrayList. 例如,subList()方法ArrayList返回名为 的内部类的实例ArrayList$SubList。不能将其List分配给类型为 的变量ArrayList