为什么这个通用代码会编译?

irr*_*ble 3 java generics

javac的推断TString在方法f().语言规范中的哪些规则导致了这个结论?

<T> T g(){ return null; }

String f()
{
    return g();
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 9

我怀疑编译器是否有效地使用了第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可应用于该部分.