为什么以下代码会打印"string"
?为什么没有错误,因为方法调用不明确?
class Mixer {
void print(String s) {
System.out.println("string");
}
void print(Object o) {
System.out.println("object");
}
public static void main(String[] args) {
Mixer m = new Mixer();
m.print(null);
}
}
答案 0 :(得分:1)
选择String
- 方法是因为它是这些类型的最具体。
由于两种方法都可访问且适用 Java选择最具体的,这在 Java语言中有所描述规范详细。
请参阅JLS§15.12.2说明:
可能有多个这样的方法,在这种情况下,选择最具体的。最具体方法的描述符(签名加返回类型)是在运行时用于执行方法调度的方法。
JLS§15.12.2.5列出了用于确定最具体的方法的所有规则。
看看以下方法:
public void foo(Object o) { ... }
public void foo(AbstractCollection<String> o) { ... }
public void foo(AbstractList<String> o) { ... }
public void foo(ArrayList<String> o) { ... }
对于每种方法,指定的类型都会更具体,如果您提供ArrayList
或null
,它将首先使用最低的方法。