为什么长期在Java中加倍?

Sen*_*rJD 3 java double long-integer

SSCCE:

public class Test {

    public static void main(String[] args) {
        Long a = new Long(1L);
        new A(a);
    }

    static class A {
        A(int i) {
            System.out.println("int");
        }

        A(double d) {
            System.out.println("double");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

double
Run Code Online (Sandbox Code Playgroud)

打印时不会出现编译错误,它可以正常工作并调用double-parameter构造函数.但为什么呢?

Bat*_*eba 8

这取决于类型提升的规则:a 优先long转换为a .doubleint

A long总是可以适合a double,虽然如果它大于2的53次幂,精度可能会丢失long.所以你的编译器选择double构造函数比一个更好int.

(编译器不进行动态在一定意义检查1L 适合的int).