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

时间:2015-02-22 07:37:22

标签: 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!";
        }


    }
}

结果是

float constructor called!

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

2 个答案:

答案 0 :(得分:19)

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

JLS 15.12.2.5

  

15.12.2.5。选择最具体的方法

     

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

     

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

答案 1 :(得分:3)

我提出JLS 5.3. Method Invocation Conversion5.1.2. Widening Primitive Conversion

  

对原始类型的19个特定转换称为扩展   原始转换:

     

byte to short,int,long,float或double

     

短,int,long,float或double

     

char to int,long,float或double

     

int to long,float或double

     

长期漂浮或加倍

     

浮动加倍

在完成转换时,基本上浮点数优先于方法重载的双精度数。