Java 中的方法重载显示非基元类型和非父子关系类的歧义



我在下面的例子中感到困惑。 有人可以解释为什么在示例 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");
    }
}

相关内容

  • 没有找到相关文章

最新更新