为什么在Java中长浇铸为双倍?

为什么在Java中长浇铸为双倍?,java,double,long-integer,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) {

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");
        }
    }
}
double
输出:

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");
        }
    }
}
double

不会打印编译错误,它工作正常并调用双参数构造函数。但是为什么呢?

这取决于类型提升的规则:一个
long
被转换成
double
,而不是
int

long
始终可以放入
double
,但如果
long
大于2的53次方,则可能会丢失精度。因此,编译器选择的
double
构造函数比
int
构造函数更合适

(编译器不会进行动态检查,即
1L
是否适合
int
)。

因为long不适合int


Check

int
为4字节,其中as
long
double
为8字节

因此,很明显,如果将数据强制转换为int,则有可能丢失4字节的数据。数据类型总是向上强制转换。正如@Bathsheba的评论所提到的,即使使用double,数据也有可能丢失,但与int相比,丢失的数据要小得多

如您所见,double使用52位来存储有效数字。如果选择int,变量将有32位可用。因此jvm选择double而不是int


来源:

long
转换为
int
是一个错误,因为它可能会丢失值的整体大小。将
long
转换为
double
是一个很好的选择


编译器将自动生成参数的转换。这包括扩大基本体转换,但不包括缩小基本体转换。因为带有
int
参数的方法需要缩小转换,所以它不适用于调用。

我理解“fit”的意思,我不明白为什么没有编译错误?因为它不是错误,所以不会出现错误。编译器可能会警告您可能有损转换。例如,在C++中,如果尝试将<代码>长Lo/<代码>值放在<代码> int <代码>或<代码>双< /COD>构造函数,将出现编译错误。