【问题标题】:Java Double Object initialization with other Number type objectsJava Double Object 初始化与其他 Number 类型对象
【发布时间】:2018-12-02 05:59:00
【问题描述】:

Double object documentation 中它只有两个构造函数,一个采用双精度值,一个采用字符串值。但是,我刚刚发现,如果我们用其他 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 的构造函数会采用其他数据类型。

【问题讨论】:

  • 因为intdoublelongdouble 是无声的扩大转化。
  • 那么在编译时发生了什么,它通过取消装箱转换为 new Double(i.intValue()),然后在运行时通过扩大转换将 int 值转换为 double?并且编译器足够聪明,知道当所需的值为 double 时将 Integer 转换为 int?

标签: java type-conversion object-initialization


【解决方案1】:
Long l = Long.valueOf(100);
Double d2 = new Double(l);

上面的代码没有调用Double(Long),它调用了可用的Double(long),参数从Long拆箱到long。这只是因为longdouble 兼容。

所以:

不过,我刚刚发现,如果我们用其他 Number 类型的对象来初始化它,它也可以工作。

不,您仍在调用以double 作为参数的相同构造函数。

附带说明,当您手头有一个Number 对象时,与其调用doubleValue() 方法来获取原语,而不是通过使用new Double(long) 构造它来创建另一个对象

【讨论】:

  • 啊,明白了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多