这个问题不是关于为什么我们将列表初始化为实现的接口,例如
List<myObject> obj = new ArrayList<myObject>();
问题是以下两个之间有何区别?为什么它们(显然)以相同的方式工作?
//list and arraylist both have a type List<myObject> obj = new ArrayList<myObject>(); //arraylist does not have a type List<myObject> obj = new ArrayList<>();
这两段代码是等效的,并ArrayList使用 类型 创建s (myObject在您的示例中):
ArrayList
myObject
List<myObject> obj = new ArrayList<myObject>(); List<myObject> obj = new ArrayList<>();
但是,第二个示例使用Java 7中引入的 菱形运算符 (<>)。它添加了类型推断,并减少了赋值的冗长性。
<>
请参阅文档中的以下引用:
您可以用一组空的类型参数(<>)来替换调用通用类的构造函数所需的类型参数,只要编译器可以从上下文中推断出类型参数即可。这对尖括号被非正式地称为菱形。 例如,考虑以下变量声明: Map<String, List<String>> myMap = new HashMap<String, List<String>>(); 在Java SE 7中,可以用一组空的类型参数(<>)代替构造函数的参数化类型: Map<String, List<String>> myMap = new HashMap<>();
您可以用一组空的类型参数(<>)来替换调用通用类的构造函数所需的类型参数,只要编译器可以从上下文中推断出类型参数即可。这对尖括号被非正式地称为菱形。
例如,考虑以下变量声明:
Map<String, List<String>> myMap = new HashMap<String, List<String>>();
在Java SE 7中,可以用一组空的类型参数(<>)代替构造函数的参数化类型:
Map<String, List<String>> myMap = new HashMap<>();