【问题标题】:Casting Preference for int float vs doubleint float 与 double 的转换偏好
【发布时间】:2017-04-22 07:31:32
【问题描述】:

这是我在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);
    }
}

答案是

double
float
float

我知道为什么它会为第一个和第二个电话提供答案,但第三个电话却是 float 。为什么?如果有,请通过一些知识链接分享答案。

【问题讨论】:

  • 嗯,这清楚地表明java隐式地将整数值转换为浮点数。
  • @gooroo7 你读过这个问题吗? OP 已经知道了,他在问 为什么 它更喜欢 float 而不是 double

标签: java casting overloading


【解决方案1】:

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

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

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

如果 S <: t href="https://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.10" rel="nofollow" target="_blank">§4.10),对于 any 表达式,类型 S 比类型 T 更具体

JLS §4.10.1. Subtyping among Primitive Types 定义:

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

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

或者将它们链接在一起,忽略char最右边的最具体

double > float > long > int > short > byte

因此,如您所见,int 值,甚至是 long 值,将选择 float 参数而不是 double 参数,但作为 JLS §5.1.2. Widening Primitive Conversion 说:

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

【讨论】:

    【解决方案2】:

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

    int 到 long、float 或 double

    注意:float 在 double 之前,如果您有一个采用 long 的方法,它将被选中。

    尽管 int 在转换为浮点数但不会转换为双精度时会丢失精度。

    【讨论】:

    • 虽然引用的 JLS 部分 发生 以该顺序列出类型,但它实际上并未定义列出的顺序与方法选择相关。请参阅my answer 了解与此问题相关的实际方法选择规则。
    猜你喜欢
    • 1970-01-01
    • 2020-08-07
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多