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

时间:2013-02-26 06:56:08

标签: java generics

来自Oracle's documentation of Type Inference

  

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

     

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

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

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

1 个答案:

答案 0 :(得分:5)

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

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

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

PrintStream out = ...;
Object bar = "bar";
out.print(bar);
out.print((Object)"foo");