我有一个通用的方法
public <K extends Number> K get()
{
...
}
当我调用此方法时,我使用如下语法:
Integer i = instance.<Integer>get();
但是,这也是合法的:
Integer i = instance.get();
我的问题是,第二种方法是否在Java中调用一种类型推断形式?
答案 0 :(得分:5)
是的,这是基于分配类型的类型推断。它在JLS的section 15.12.2.8中指定:
如果没有从实际参数的类型推断出任何方法的类型参数,现在推断它们如下。
- 如果方法结果发生在将要进行赋值转换(第5.2节)的上下文中,则将R作为方法的声明结果类型,并让R'= R [T1 = B (T1)...... Tn = B(Tn)]其中B(Ti)是上一节中Ti的推断类型,如果没有推断出类型,则为Ti。
然后,一组初始约束包括:
创建
- 约束S&gt;&gt; R',如果R不是空的;和
- 附加约束条件Bi [T1 = B(T1)... Tn = B(Tn)]&gt; Ti,其中Bi是Ti的声明界限,
并使用部分算法(第15.12.2.7节)推断类型参数的约束。解决任何相等约束,然后,对于形式Ti&lt;:Uk的每个剩余约束,推断参数Ti为glb(U1,...,Uk)(§5.1.10)。