使用其他数字类型对象初始化Java Double对象

5
Double object documentation中,它只有两个构造函数,一个接受double值,另一个接受string值。然而,我发现如果我们使用其他Number类型对象进行初始化,它也可以工作。例如,以下代码将起作用:
Integer i = Integer.valueOf(10);
Double d1 = new Double(i);
Long l = Long.valueOf(100);
Double d2 = new Double(l);

所以我想知道背后的原因是什么?自动装箱/拆箱会在Double/double、Long/long和Integer/int之间进行转换,但我不明白为什么Double的构造函数会接受其他数据类型。

1
因为 intdoublelongdouble 是静默扩展转换。 - shmosel
所以在那里发生的事情是,在编译时它被转换为new Double(i.intValue()),通过拆箱操作,并且在运行时将int值通过扩展转换为double?而编译器足够聪明,知道在需要double值时将Integer转换为int? - sabcyang
1个回答

4
Long l = Long.valueOf(100);
Double d2 = new Double(l);

上面的代码并没有调用Double(Long)构造函数,而是使用了可用的Double(long)构造函数,并将参数从Long类型拆箱为long类型。这只有在long类型与double类型兼容时才有效。
所以:

然而,我刚刚发现如果我们使用其他Number类型对象进行初始化也可以正常工作。

不,你仍然调用了带有double参数的同一个构造函数。
另外,当您手头有一个Number对象时,最好调用其doubleValue()方法来获取原始值,而不是通过使用new Double(long)构造另一个对象。

1
好的,明白了。谢谢! - sabcyang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接