Вызов метода Java может быть параметризован, как в следующем коде:
class Test
{
<T> void test()
{
}
public static void main(String[] args)
{
new Test().<Object>test();
// ^^^^^^^^
}
}
Я узнал, что это возможно в диалоговом окне настроек Java Formatter Eclipse и задалось вопросом, есть ли случаи, когда это полезно или требуется.
ИЗМЕНИТЬ
Основываясь на превосходном ответе Арне, я пришел к следующему выводу:
В дополнение к улучшенной безопасности типов, поскольку пример Арне иллюстрирует вызов с параметризованным методом, вы можете указать общий базовый тип аргументов методов, которые должны быть типом элементов контейнера. Этот тип обычно автоматически вычисляется компилятором по наиболее определенному базовому типу. Путем параметризации вызова метода это поведение может быть переопределено. Вызов параметризованного метода может потребоваться, если компилятор имеет несколько общих типов.
В следующем примере показано, что поведение:
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, но не легко понято.