Java int-float与double的铸造偏好

Java int-float与double的铸造偏好,java,casting,overloading,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

下面是我的代码,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

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

JLS 5.1.2涵盖了扩展规则

int到long、float或double

注意:float在double之前,如果您有一个花费
long
的方法,则会选择它


尽管事实上int可能会失去转换为浮点而不是双精度的精度。

JLS 5.1.2涵盖了加宽规则

int到long、float或double

注意:float在double之前,如果您有一个花费
long
的方法,则会选择它

尽管int可能会失去转换为float而不是double的精度,但这是事实。

JLS指定了选择最合适方法的规则。相关部分包括(我用粗体突出显示):

如果一个方法调用可以访问并适用于多个成员方法,则有必要选择一个成员方法来为运行时方法分派提供描述符。Java编程语言使用的规则是选择最具体的方法

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

如果s1
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所说:

    int
    float
    ,或从
    long
    float
    ,或从
    long
    double
    的扩大原语转换可能会导致精度损失-也就是说,结果可能会丢失一些值的最低有效位

    JLS指定了选择最合适方法的规则。相关部分包括(我用粗体突出显示):

    如果一个方法调用可以访问并适用于多个成员方法,则有必要选择一个成员方法来为运行时方法分派提供描述符。Java编程语言使用的规则是选择最具体的方法

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

    如果s1
    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所说:

    int
    float
    ,或从
    long
    float
    ,或从
    long
    double
    的扩大原语转换可能会导致精度损失-也就是说,结果可能会丢失一些值的最低有效位


    好的,这清楚地表明java隐式地将整数值转换为浮点数。@gooroo7你读过这个问题了吗?OP已经知道了,他在问为什么它更喜欢
    float
    而不是
    double
    。这清楚地表明java隐式地将整数值转换为float。@gooroo7你读过这个问题了吗?OP已经知道,他在问为什么它更喜欢
    float
    而不是
    double
    。虽然引用的JLS部分碰巧按该顺序列出了类型,但实际上并没有定义列出的顺序与方法选择相关。有关与此问题相关的方法选择的实际规则,请参阅。虽然参考的JLS部分碰巧以该顺序列出了类型,但实际上并未定义列出的顺序与方法选择相关。有关此问题的方法选择的实际规则,请参见。