You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

包含父子类的方法重载:为何以下代码输出"string"且无歧义错误?

为什么调用m.print(null)输出"string"且无歧义?

这个问题问得很到位!咱们用Java的方法重载解析规则一步步拆解明白:

1. 重载方法匹配的核心规则:优先选最具体的类型

Java编译器处理重载方法调用时,遵循**「最具体匹配」**原则:当多个重载方法都能匹配传入参数时,会优先选择参数类型最具体的那个方法。

看你的代码:

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);
    }
}

null是所有引用类型的合法值,所以它既可以匹配String类型参数,也能匹配Object类型参数。但StringObject子类String类型比Object更「具体」——简单说就是StringObject的细化类型,编译器会认定print(String)是更合适的候选方法,因此调用它输出"string"。

2. 为什么没有方法调用歧义?

歧义只会在多个重载方法的参数类型无继承关系、且都能匹配参数时出现。比如如果你的代码再加一个print(Integer i)方法,此时传null就会编译报错——因为StringInteger都是Object的子类,但二者之间没有继承关系,编译器没法判断哪个更具体,这才会触发歧义。

而你的代码里只有StringObject两个参数类型,它们是明确的父子继承关系,编译器能清晰判定优先级,所以不会出现歧义错误。


内容的提问来源于stack exchange,提问作者Sourabh

火山引擎 最新活动