如何在Java中解决重载方法的选择歧义?

Jij*_*joy 18 java

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这里,输出是

String null

为什么JVM将方法解析为带有String参数的方法?

在此先感谢J

Mat*_*hen 16

这是一个相当精细的算法,详见JLS 15.12.但这里相关的部分是15.12.2,其中说"选择最具体的部分".Object和String重载都是"可访问和适用的"(String适用,因为null文字是所有类型的引用),String更具体.

编辑:修正部分,每个语法.

  • 我想你想要15.12.2.15.11.2是关于使用super关键字访问超类成员. (2认同)

Mic*_*rdt 10

这些方法"过载",而不是"模棱两可".

根据Java语言规范:

调用方法时(第15.12节),在编译时使用实际参数的数量(以及任何显式类型参数)和参数的编译时类型来确定将被调用的方法的签名( §15.12.2).

并且§15.12.2说:

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

String更具体Object,因此虽然null与两者兼容,但String选择了带参数的方法(当参数类型是类或接口层次结构的一部分时,有更复杂的规则适用).