【发布时间】:2017-05-05 04:52:39
【问题描述】:
我试图了解 Java 重载规则。除了跟随,一切似乎都很好,
public static void main(String[] args) {
long aLong = 123L;
foo(aLong);
}
private static void foo(double aDouble) {
System.out.println("Foo aDouble");
}
private static void foo(Long aWrapperLong) {
System.out.println("Foo Wrapper Long");
}
private static void foo(int anInt) {
System.out.println("Foo Int");
}
private static void foo(float aFloat) {
System.out.println("Foo Float");
}
为什么调用解析为foo(float aFloat)。我从 JLS 了解以下内容,
此步骤使用方法的名称和参数的类型 用于定位既可访问又适用的方法的表达式 可能有不止一种这样的方法,在这种情况下,最 选择特定的。
我在这里有意使用 Wrapper Long 而不是原始的 long。大小为 64 位的原始 long 不会以 foo(double aDouble) 结尾,而是以 32 位浮点数结尾 foo(float aFloat)。
Why does Java implicitly (without cast) convert a `long` to a `float`?这个问题进一步阐明了这个问题的答案。
【问题讨论】:
-
非常好的问题,这一点尤其重要,因为并非所有高于 16777215 的值都不能在没有精度损失的情况下以浮点数表示。例如 16777217,当转换为浮点数时将四舍五入为 1.6777216E7。
-
关于编辑:64 位长与 64 位双精度无关。请参阅about mantissa 了解差异。
标签: java overloading