Java方法调用可以像以下代码一样进行参数化:
class Test
{
<T> void test()
{
}
public static void main(String[] args)
{
new Test().<Object>test();
// ^^^^^^^^
}
}
我从Eclipse Java Formatter设置对话框中发现这是有可能的,想知道是否有任何情况下这是有用或必需的。
编辑
基于Arne出色的答案,我得出了以下结论:
除了像Arne的示例所示的改进的类型安全性之外,参数化方法调用使您能够指定方法参数的公共基础类型,该类型应为容器元素的类型。通常情况下,编译器会自动推断此类型为最具体的公共基础类型。通过参数化方法调用,可以覆盖此行为。如果编译器推断出多个公共类型,则可能需要使用参数化方法调用。
以下示例演示了该行为:
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);
}
}
这种行为在Java语言规范第三版的第8.4.4和15.12.2.7段中有定义,但不易理解。