为什么类型推断算法试图找到最具体的类型?

Gee*_*eek 6 java generics

来自Oracle的Type Inference文档

类型推断是Java编译器查看每个方法调用和相应声明的能力,以确定使调用适用的类型参数(或参数).推理算法确定参数的类型,如果可用,还确定分配或返回结果的类型.最后,推理算法试图找到适用于所有参数的最具体类型.

为了说明最后一点,在下面的示例中,推断确定传递给pick方法的第二个参数是Serializable类型:

static <T> T pick(T a1, T a2) { return a2; }
Serializable s = pick("d", new ArrayList<String>());
Run Code Online (Sandbox Code Playgroud)

为什么算法试图找到最具体的类型?

Jav*_*ier 5

因为如果不强制执行此规则,赋值兼容性会使调用不明确.

例如,PrintStream定义print(Object)并且print(String)如果未强制执行最具体类型的规则,则print("bar")可以调用print(Object)而不是print(String),这将违反直觉.

请注意,类型选择基于编译时类型,因此在以下示例print(Object)中调用:

PrintStream out = ...;
Object bar = "bar";
out.print(bar);
out.print((Object)"foo");
Run Code Online (Sandbox Code Playgroud)