Java 泛型类型绑定。为什么不进行编译?

2022-09-04 03:37:36

给定此通用函数:

<T> List<T> function() { return null; }

为什么会编译

List<String> l = function();

虽然这不是吗

List<String> l = (List<String>) function();

答案 1

因为当你做这样的演员表时:

(List<String>) function()

编译器无法推断调用的类型参数,并回退到 绑定到 。function()TObject

List<String> l = function();

它可以推断出 的正确类型。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();
        //                              ^^^^^^^^^^^^^
    }
}

我不知道泛型参数的确切类型推断规则。但是,它们在 JLS 第 15.12.2.7 节中指定。


答案 2

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

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

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


推荐