来自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>());
为什么算法会尝试找到最具体的类型?
答案 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");