Java语法:在方法调用中显式指定泛型参数

105

如何显式地为Java泛型方法给定类型参数的语法是什么?

3个回答

97

以下内容不是语法

<ArgType>genericMethod()

看起来类型参数必须跟在点号后面,就像这样

SomeClass.<ArgType>genericMethod()
this.<ArgType>genericMethod()
p.<ArgType>genericMethod()
super.<ArgType>genericMethod()
SomeClass.super.<ArgType>genericMethod()
SomeClass.this.<ArgType>genericMethod()

8
对于一个import static方法,这个怎么处理?它没有与类或this绑定,正如你所说,第一种语法不起作用。请问该怎么办? - Coderer
6
静态方法必须位于某个类中,所以您可以使用SomeClass.<ArgType>genericMethod()。如果您没有导入该类,则需要使用类的完整限定名。我相信您已经知道这一点,并希望得到一个更令人满意的答案。个人认为,为何不能将<ArgType>genericMethod()语法添加到语言中呢?它是否会产生歧义? - Theodore Norvell
我实际上还没有尝试过类的FQN,我只是从import static pack.MyClass.someMethod; someMethod();切换到了import pack.MyClass; MyClass.<ArgType>someMethod(),但当然它仍然比你在答案中提供的“希望这个能工作”的反例更冗长。 - Coderer
1
这被称为类型证明器 - John McClane
1
是的。有时候类型参数被称为类型见证者。这很好知道,我之前不知道。JLS使用术语类型参数。Java教程中的泛型指南有时使用类型参数,有时使用类型见证者 - Theodore Norvell
谢谢你,你救了我。但这太尴尬了。 - lnogueir

89
根据Java规范,例如:

According to the Java specification that would be for example:

Collections.<String>unmodifiableSet()

(很抱歉我要问自己并回答自己的问题 - 我已经第三次查找这个了。:-)

)


3

一个很好的示例是来自java.util.Collection的泛型方法,它定义了自己的泛型类型,像Collection.toArray,其方法签名如下:

<T> T[] toArray(T[] a);

这里声明了一个泛型类型T,它由参数T[] a在方法调用时定义,并返回T的数组。因此,相同的实例可以以通用的方式调用toArray方法:

Collection<Integer> collection = new ArrayList<Integer>();
collection.add(1);
collection.add(2);

// Call generic method returning Integer[]
Integer[] ints = collection.toArray(new Integer[]{});

// Call generic method again, this time returning an Number[] (Integer extends Number)
Number[] nums = collection.toArray(new Number[]{});

此外,还可以查看Java泛型类型参数教程

8
也许你可以补充一下显式给调用传递类型参数的部分(可以参考我的回答)。这样它就可以成为一个很好的标准答案了;现在它并没有回答问题,因为编译器在调用中隐式推断了参数的类型。 :-) - Hans-Peter Störr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接