6

来自Oracle 的类型推断文档

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

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

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

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

4

1 回答 1

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");
于 2013-02-26T07:13:37.717 回答