Одна точка зрения заключается в том, что, когда общий параметр явно не задан, он выводится. Обычно это выводится из аргументов, но когда аргументов нет, в ограниченных случаях (например, объявление переменных) это можно сделать с левой стороны.
Другая точка зрения заключается в том, что, когда общий параметр явно не задан, компилятор не имеет значения, что именно такой параметр. В конце концов, параметр типа не влияет на скомпилированный байт-код вообще. Он просто должен быть в состоянии доказать, что существует некоторый параметр типа, который заставил бы его работать; и это все равно. Для ситуации может быть несколько допустимых параметров типа; но неважно, какой из них «используется», потому что он не влияет на результат. В этом случае, поскольку метод не принимает аргументов и возвращает List<T>
, где T
является общим для этого метода, если он используется в контексте, который принимает List
, он действителен, поскольку независимо от List<what exactly>
, действительный T
есть (T
= whatever type parameter is desired
). Поэтому в этом случае компилятору вообще не нужно проверять параметр типа.
Это делается с левой стороны декларации. –
Это, вероятно, один из немногих не совсем бесполезных случаев, когда общий параметр, используемый только один раз в сигнатуре метода, имеет смысл. (Хотя и не так много с оператором алмаза, присутствующим в Java 7.) – millimoose