为什么在调用构造函数时,int隐式地转换为float而不是double?

Sta*_*low 11 java constructor

我写了这个测试代码

public class ConstructorTestApplication {

    private static String result;


    public static void main(String[] args) {

        ConstructorTest test1 = new ConstructorTest(0);
        System.out.println(result);
    }

    private static class ConstructorTest {

        public ConstructorTest(double param){
            result = "double constructor called!";
        }
        public ConstructorTest(float param) {
            result = "float constructor called!";
        }


    }
}
Run Code Online (Sandbox Code Playgroud)

结果是

float constructor called!
Run Code Online (Sandbox Code Playgroud)

为什么调用float构造函数而不是双构造函数?这是动态方法查找的一部分吗?

Era*_*ran 20

ConstructorTest(float param)是两个构造函数中最具体的方法,因为带double参数的方法可以接受任何float值,但反之则不然.

JLS 15.12.2.5:

15.12.2.5.选择最具体的方法

如果多个成员方法都可访问并适用于方法调用,则必须选择一个为运行时方法调度提供描述符.Java编程语言使用选择最具体方法的规则.

非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个没有编译时类型错误的调用,那么一个方法比另一个方法更具体.