在 Java 规范 ( http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.9 ) 中, new 具有以下形式:
ClassInstanceCreationExpression ::=
| new TypeArguments_opt TypeDeclSpecifier TypeArgumentsOrDiamond_opt
( ArgumentListopt ) ClassBodyopt
| Primary . new TypeArguments_opt Identifier TypeArgumentsOrDiamond_opt
( ArgumentListopt ) ClassBodyopt
new 之后的第一个可选类型参数列表的目的是什么?我在阅读第 15.9 节时无法找到它(所有对类型参数列表的引用似乎都引用了类型/标识符之后的列表)。在标准 Java 编译器上测试随机位会产生令人困惑的结果:
public class Foo<T> { }
// ...
Foo<Integer> t1 = new <Integer> Foo<Integer>(); // works
Foo<Integer> t2 = new <Integer> Foo(); // works -- unchecked warning missing the type arg after Foo
Foo<Integer> t3 = new <Boolean> Foo<Integer>(); // works
Foo<Integer> t4 = new <Float, Boolean> Foo<Integer>(); // works
Foo<Integer> t5 = new <NotDefined> Foo<Integer>(); // fails -- NotDefined is undefined
在这些简单的例子中,第一个参数列表似乎没有做任何有意义的事情,尽管它解析并检查其参数的有效性。