新建后的构造函数调用中类型参数的用途是什么?

在Java规范( http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.9 )中,new具有以下forms:

ClassInstanceCreationExpression ::= | new TypeArguments_opt TypeDeclSpecifier TypeArgumentsOrDiamond_opt ( ArgumentListopt ) ClassBodyopt | Primary . new TypeArguments_opt Identifier TypeArgumentsOrDiamond_opt ( ArgumentListopt ) ClassBodyopt 

新的第一个可选类型参数列表的目的是什么? 我无法从我对15.9节的读取中找到它(对类型参数列表的所有引用似乎都引用了类型/标识符之后的列表)。 测试标准Java编译器上的随机位会产生令人困惑的结果:

 public class Foo { } // ... Foo t1 = new  Foo(); // works Foo t2 = new  Foo(); // works -- unchecked warning missing the type arg after Foo Foo t3 = new  Foo(); // works Foo t4 = new  Foo(); // works Foo t5 = new  Foo(); // fails -- NotDefined is undefined 

在这些简单的例子中,虽然它解析并检查其参数的有效性,但似乎第一个参数列表没有任何意义。

构造函数也可以声明类型参数

 public class Main { public static class Foo { public  Foo(T object, E object2) { } } public static void main(String[] args) throws Exception { Foo foo = new  Foo(1, "hello"); } } 

这就是构造函数调用之前的 。 它是构造函数的类型参数。

下列

 Foo foo = new  Foo(1, new Object()); 

失败了

Main.Foo类型的参数化构造函数Foo(Integer,String)不适用于参数(Integer,Object)

在你的最后

 Foo t5 = new  Foo(); // fails -- NotDefined is undefined 

NotDefined不是编译期间找到的类型。 如果是,它只会给你一个警告,它是unused

你可以为方法调用添加无用的类型参数,像

 Math.max(1,2); System.out. 

见http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.1-200-E

非generics方法可能适用于提供显式类型参数的调用。 实际上,它可能适用。 在这种情况下,类型参数将被忽略。

该规则源于兼容性和可替代性原则的问题。 由于接口或超类可以独立于其子类型进行生成,因此我们可以使用非generics方法覆盖generics方法。 但是,重写(非generics)方法必须适用于对generics方法的调用,包括显式传递类型参数的调用。 否则,子类型不能替代其生成的超类型。