我对下面的例子感到困惑。有人可以解释一下为什么在示例 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
应该是一个 String
对象,且为 null
。
但在示例 2 中,public static void name(String s)
和 public static void name(Integer s)
具体而言是相同的。因此 FinalTest
中的方法 name(String)
和 FinalTest
中的方法 name(Integer)
均与 匹配名称(空);
.
参见15.12.2.5. Choosing the Most Specific Method 详细说明。
以下应该有效:
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");
}
}
关于java - Java 中的方法重载显示非基本类型和非父子关系类的歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43422928/