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

标签 java oop polymorphism

我对下面的例子感到困惑。有人可以解释一下为什么在示例 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/

相关文章:

java - Java中的Jooq自定义绑定(bind)注册

java - 如何在 Maven 项目中正确导入 org.w3c.dom?

java - 为什么在 java.io.InputStream 中只有 mark() 和 reset() 方法同步?

c# - 将方法绑定(bind)到实现类

design-patterns - 构建大型对象层次结构的模式

c# - 存储在通用集合中后重载和多态行为发生变化

java - java中的方法重载和继承

java - 如何获取设备网络信息? (安卓)

java - 从数组中删除对象并将其替换为另一个数组中的对象

c++ - 侵犯隐私 - C++ 标准如何处理它?