首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Java中解决从重载方法中进行选择的模糊性?

如何在Java中解决从重载方法中进行选择的模糊性?
EN

Stack Overflow用户
提问于 2010-04-09 14:50:00
回答 5查看 5.3K关注 0票数 18
代码语言:javascript
复制
package org.study.algos;
public class Study {

    public static void main(String[] args) {
       A a = new A();
       a.m1(null);
    }
 }
 class A {
    public void m1(String s) {
       System.out.println("String");
        System.out.println(s);
    }
    public void m1(Object obj) {
       System.out.println("Object");
       System.out.println(obj);
    }
}

在这里,输出是

字符串空

为什么JVM要将方法解析为带有字符串参数的方法?

提前感谢J

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-04-09 14:53:47

这是一个相当精细的算法,在JLS 15.12中详细介绍。但是这里相关的部分是15.12.2,它说“最具体的是被选中的。”对象和字符串重载都是“可访问和适用的”(该字符串适用,因为null文字是所有类型的引用),并且字符串更具体。

编辑:更正部分,每个句法。

票数 16
EN

Stack Overflow用户

发布于 2010-04-09 14:59:40

这些方法“重载”,而不是“模棱两可”。

根据Java语言规范

当调用方法(§15.12)时,在编译时使用实际参数(和任何显式类型参数)的数量和参数的编译时类型来确定要调用的方法的签名(§15.12.2)。

第15.12.2条规定:

可能有多个这样的方法,在这种情况下,选择最具体的一个

StringObject更具体,所以虽然null与两者兼容,但是选择了带有String参数的方法(当参数类型是类或接口层次结构的一部分时,应用的规则要复杂得多)。

票数 10
EN

Stack Overflow用户

发布于 2010-04-09 14:59:33

可以将空值设置为任何类型的引用。您拥有的所有重载方法都位于一个继承层次结构对象<- String中,最不常用的方法正在选择。但是,如果有两个重载的方法不在同一层次结构中,那么您就会得到有关矛盾方法的编译错误。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2608394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档