Какова цель аргументов типа в вызове конструктора после new?
В спецификации 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
Какова цель первого необязательного списка аргументов типа после нового? Я не смог найти его в моем прочтении раздела 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
На этих простых примерах не похоже, что этот первый список параметров делает что-то значимое, хотя он анализирует и проверяет правильность своих аргументов.