Java泛型类型绑定.为什么不编译?

Mr.*_*art 13 java generics

鉴于此通用功能:

<T> List<T> function() { return null; }
Run Code Online (Sandbox Code Playgroud)

为什么这会编译

List<String> l = function();
Run Code Online (Sandbox Code Playgroud)

虽然这不

List<String> l = (List<String>) function();
Run Code Online (Sandbox Code Playgroud)

aio*_*obe 8

因为你做这样的演员:

(List<String>) function()
Run Code Online (Sandbox Code Playgroud)

编译器不能推断该类型参数function()调用,并倒在绑定TObject.

而在

List<String> l = function();
Run Code Online (Sandbox Code Playgroud)

可以推断出正确的类型T.

请注意,您可能会如果通过显式地提供类型规避类型推断的工作投:

import java.util.List;

class Test {
    public static <T> List<T> function() { return null; }

    public static void main(String[] args) {
        List<String> l = (List<String>) Test.<String>function();
        //                              ^^^^^^^^^^^^^
    }
}
Run Code Online (Sandbox Code Playgroud)

我不知道通用参数的确切类型推理规则.然而,它们在JLS第15.12.2.7节中规定.


Boz*_*zho 2

看起来类型推断是在尝试强制转换(由编译器)之后发生的。

表达式的类型由表达式的左侧确定,在尝试强制转换时该左侧尚未“解析”。并且转换本身会失败,因为对于尚未推断的类型,(方法调用的)结果是类型List<Object>

JLS第15.12.2.7节指出类型推断最后发生。