Java 泛型类型绑定。为什么不进行编译?
给定此通用函数:
<T> List<T> function() { return null; }
为什么会编译
List<String> l = function();
虽然这不是吗?
List<String> l = (List<String>) function();
给定此通用函数:
<T> List<T> function() { return null; }
为什么会编译
List<String> l = function();
虽然这不是吗?
List<String> l = (List<String>) function();
因为当你做这样的演员表时:
(List<String>) function()
编译器无法推断调用的类型参数,并回退到 绑定到 。function()
T
Object
在
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 节中指定。
看起来类型推断发生在尝试强制转换(由编译器)之后。
表达式的类型由表达式的左侧确定,在尝试强制转换时,该表达式尚未“解析”。强制转换本身会失败,因为对于尚未推断的类型,结果(方法调用)是类型List<Object>
JLS 的第 15.12.2.7 节指示类型推断最后发生。