我有一个通用的方法
public <K extends Number> K get()
{
...
}
Run Code Online (Sandbox Code Playgroud)
当我调用此方法时,我使用如下语法:
Integer i = instance.<Integer>get();
Run Code Online (Sandbox Code Playgroud)
但是,这也是合法的:
Integer i = instance.get();
Run Code Online (Sandbox Code Playgroud)
我的问题是,第二种方法是在Java中调用一种类型推断吗?
是的,这是基于分配类型的类型推断.它在JLS的第15.12.2.8节中规定:
如果没有从实际参数的类型推断出任何方法的类型参数,现在推断它们如下.
- 如果方法结果发生在它将受到赋值转换(第5.2节)到类型S的上下文中,那么让R成为方法的声明结果类型,并让R'= R [T1 = B(T1) ...... Tn = B(Tn)]其中B(Ti)是上一节中Ti的推断类型,如果没有推断出类型,则推断Ti.
然后,一组初始约束包括:
- 约束S >> R',条件是R不是空的; 和
- 附加约束Bi [T1 = B(T1)... Tn = B(Tn)] >> Ti,其中Bi是Ti的声明界限,
创建并用于使用section(第15.12.2.7节)的算法推断类型参数的约束.解决任何等式约束,然后,对于形式Ti <:Uk的每个剩余约束,推断参数Ti为glb(U1,...,Uk)(第5.1.10节).
| 归档时间: |
|
| 查看次数: |
205 次 |
| 最近记录: |