Java 方法调用可以像下面的代码一样进行参数化:
class Test
{
<T> void test()
{
}
public static void main(String[] args)
{
new Test().<Object>test();
// ^^^^^^^^
}
}
我从 Eclipse Java Formatter 设置对话框中发现这是可能的,并想知道是否有任何情况下这是有用或需要的。
EDIT
根据阿恩的出色回答,我得出以下结论:
除了提高类型安全性(如 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 段中定义,但不容易理解。
我从未在实践中使用过它,但您可以想象使用它来实现类型安全。考虑以下方法:
<T> void method(T... items) {
List<T> list = new ArrayList<T>();
for (T item : items)
list.add(item);
System.out.println(list);
}
你可以这样称呼它:
o.<Object>method("Blah", new Long(0));
o.<Number>method(new Integer(100), new Long(0));
但这会引发编译器错误:
o.<Number>method("String", new Long(0));
因此,您有一个类型安全的通用方法,可以用于每个对象,而不仅限于特定的接口或类。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)