关于它为什么会以这种方式完成,有一本尘土飞扬的大部头,但让我们具体看看 ArrayList 的声明。
要说明这一点:在 Java 6 发布时,该语言还没有在新泛型时减少冗长的能力。
This is the grammar for declaring a new instance of a reference, back in Java 6.
ClassInstanceCreationExpression:
new TypeArguments (opt) ClassOrInterfaceType ( ArgumentList (opt) )
ClassBody (opt)
Primary. new TypeArguments (opt) Identifier TypeArguments (opt) (
ArgumentList (opt) ) ClassBody (opt)
ArgumentList:
Expression
ArgumentList , Expression
第二个产生式,或者更具体地说,TypeArguments 标记是控制我们可以放在那里的东西。
That changes in Java 7,引入菱形算子。
ClassInstanceCreationExpression:
new TypeArguments (opt) TypeDeclSpecifier TypeArgumentsOrDiamond (opt)
( ArgumentList (opt) ) ClassBody (opt)
Primary . new TypeArguments (opt) Identifier TypeArgumentsOrDiamond (opt)
( ArgumentList (opt) ) ClassBody (opt)
TypeArgumentsOrDiamond:
TypeArguments
<>
ArgumentList:
Expression
ArgumentList , Expression
因此,由于 TypeArgumentsOrDiamond 令牌,冗长不再需要存在,但无论如何,较新版本的 Java 仍然支持它。
以你的例子为例,为什么我们不能这样做:
ArrayList<Object> name = new();
想到的主要事情是,如果你想创建一个List 的实例,它是一个接口,因此不能被实例化,new() 方法如何知道是哪一种 的列表拉回来?它总是会撤回ArrayList吗? LinkedList?还是您自己的列表类型之一?没有你告诉 Java 怎么知道哪个是正确的?
更直接地说,这个应该产生什么......
List<Object> name = new();
...如果我们可以在 ArrayList、LinkedList 或扩展 ArrayList 的 SpecialUtilityList 之间进行选择?