javac的推断T是String在方法f().语言规范中的哪些规则导致了这个结论?
<T> T g(){ return null; }
String f()
{
return g();
}
Run Code Online (Sandbox Code Playgroud)
我怀疑编译器是否有效地使用了第15.12.2.8节:
如果方法结果发生在它将受到赋值转换(第5.2节)到类型S的上下文中,那么让R成为方法的声明结果类型
这会将return语句视为需要进行赋值转换.例如,假设我们转换f()为:
String f()
{
String tmp = g();
return tmp;
}
Run Code Online (Sandbox Code Playgroud)
现在关于它是否受赋值转换的影响,第14.17节(return语句)包含:
带有Expression的return语句必须包含在声明为返回值(第8.4节)或发生编译时错误的方法声明中.Expression必须表示某种类型T的变量或值,否则会发生编译时错误.类型T必须可赋值(第5.2节)到方法的声明结果类型,否则会发生编译时错误.
该引用到5.2是"赋值转换"部分,所以我想这意味着表达g() 是 "受赋值转换",导致部分15.12.2.8可应用于该部分.
| 归档时间: |
|
| 查看次数: |
179 次 |
| 最近记录: |