这个问题不是为什么我们将列表初始化为接口而不是实现,例如
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<>();
答案 0 :(得分:1)
在第二个示例中,Java假定类型为myObject。所以还有一种类型。
答案 1 :(得分:1)
这两段代码都是等效的,并使用类型(在您的示例中为ArrayList
)创建myObject
:
List<myObject> obj = new ArrayList<myObject>();
List<myObject> obj = new ArrayList<>();
然而,第二个示例使用Java 7中引入的菱形运算符(<>
)。它添加了类型推断并减少了赋值中的详细程度。
请参阅documentation:
中的以下引用您可以替换调用构造函数所需的类型参数 一个具有空集类型参数(
<>
)的泛型类的长度 因为编译器可以从上下文中推断出类型参数。这个 一对尖括号被非正式地称为钻石。例如,请考虑以下变量声明:
Map<String, List<String>> myMap = new HashMap<String, List<String>>();
在Java SE 7中,您可以替换参数化类型 带有一组空类型参数(
<>
)的构造函数:Map<String, List<String>> myMap = new HashMap<>();