int float与double的转换首选项

时间:2017-04-22 07:31:33

标签: java casting overloading

这是我的代码简单重载java中的代码。

public class Test {
    static void test(float x){
        System.out.print("float");
    }

    static void test(double x){
        System.out.print("double");
    }

    public static void main(String[] args){
        test(99.9);
        test(99.9f);
        test(99);
    }
}

ans是

double
float
float

我知道为什么它会给出第一次和第二次通话的答案,但是对于第三次,它会调用浮动。为什么?如果有的话,请与一些知识链接分享答案。

2 个答案:

答案 0 :(得分:2)

JLS 5.1.2涵盖了扩大规则https://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.1.2

  

int to long,float或double

注意:float在double之前,如果你有一个方法,它会选择long

尽管int可能会失去精度转换为float而不是double。

答案 1 :(得分:2)

JLS §15.12.2.5. Choosing the Most Specific Method指定选择最合适方法的规则。相关部分(由我大胆突出):

  

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

     

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

  

对于任何表达式,类型S 更具体而不是类型T,如果S<:T(§4.10)。

JLS §4.10.1. Subtyping among Primitive Types定义:

  

以下规则定义了基元类型之间的直接超类型关系:

     
      
  • double> 1 float
  •   
  • float> 1 long
  •   
  • long> 1 int
  •   
  • int> 1 char
  •   
  • int> 1 short
  •   
  • short> 1 byte
  •   

或者将它们链接起来,忽略char最右边是特定

double> float> long> int> short> byte

因此,正如您所看到的, int值,甚至是long值,将在float参数上选择double参数,当时,正如JLS §5.1.2. Widening Primitive Conversion所说:

  

可能会导致从intfloat,或从longfloat,或从longdouble的扩展原始转换在精度损失中 - 也就是说,结果可能会丢失该值的一些最低有效位。