我在下面的例子中感到困惑。 有人可以解释为什么在示例 1 中它会打印"st",而在示例 2 中为非基元类型和非父子关系类提供编译时歧义。
例 1
public class FinalTest {
public static void main(String[] args) {
name(null);
}
public static void name(String s) {
System.out.println("st");
}
public static void name(Object s) {
System.out.println("obj");
}
}
例 2
public class FinalTest {
public static void main(String[] args) {
name(null);
}
public static void name(String s) {
System.out.println("st");
}
public static void name(Integer s) {
System.out.println("obj");
}
}
在示例 1 中,public static void name(String s)
比 public static void name(Object s)
更具体。因此,name(null);
中的null
应该是null
String
对象。
但在示例 2 中,public static void name(String s)
和 public static void name(Integer s)
在特定方面是相等的。因此,方法name(String)
FinalTest
,方法name(Integer)
FinalTest
匹配name(null);
。
参见 15.12.2.5。选择最具体的方法进行详细说明。
以下方法应该有效:
public class FinalTest {
public static void main(String[] args) {
String s = null;
name(s);
Object o = null;
name(o);
Integer i = null;
name(i);
}
public static void name(String s) {
System.out.println("String");
}
public static void name(Object s) {
System.out.println("Object");
}
public static void name(Integer s) {
System.out.println("Integer");
}
}