类型推断是Java编译器查看每个方法调用和相应声明以确定使调用适用的类型参数(或多个参数)的能力。推理算法确定参数的类型,如果可用,则确定分配或返回结果的类型。最后,推理算法试图找到适用于所有参数的最特定类型。 为了说明最后一点,在下面的示例中,推断确定传递给pick方法的第二个参数是Serializable类型:
static <T> T pick(T a1, T a2) { return a2; }
Serializable s = pick("d", new ArrayList<String>());
为什么算法试图找出最具体的类型?
发布于 2013-02-25 23:13:37
因为如果不强制执行此规则,则分配兼容性将使调用变得模糊不清。
例如,如果没有强制执行最特定类型的规则,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");
https://stackoverflow.com/questions/15083158
复制