Вызов метода Java может быть параметризован, как показано в следующем коде:
class Test
{
<T> void test()
{
}
public static void main(String[] args)
{
new Test().<Object>test();
// ^^^^^^^^
}
}
Я узнал, что это возможно в диалоговом окне настроек Eclipse Java Formatter, и подумал, есть ли случаи, когда это полезно или требуется.
EDIT
На основании превосходного ответа Арне я пришел к следующему выводу:
В дополнение к улучшенной безопасности типов, как показывает пример Арне, вызов параметризованного метода позволяет вам указать общий базовый тип аргументов методов, который должен быть типом элементов контейнера. Этот тип обычно автоматически определяется компилятором для наиболее общего базового типа. При параметризации вызова метода это поведение может быть переопределено. Вызов параметризованного метода может потребоваться, если компилятор определяет несколько общих типов.
Следующий пример демонстрирует это поведение:
import java.util.Arrays;
import java.util.List;
class Test
{
public static void main(String[] args)
{
Integer a=new Integer(0);
Long b=new Long(0);
List<Object> listError=Arrays.asList(a, b);
//error because Number&Comparable<?> is not Object
List<Object> listObj=Arrays.<Object>asList(a, b);
List<Number> listNum=Arrays.<Number>asList(a, b);
List<Comparable<?>> listCmp=Arrays.<Comparable<?>>asList(a, b);
}
}
Это поведение определено в параграфах 8.4.4 и 15.12.2.7 спецификации языка Java третьего издания, но не так легко понять.