java:自动装箱和铸造?

use*_*992 0 java autoboxing

我对一个小问题感到困惑,请参阅以下内容:

Double j = new Double(5); // No problem.
double j =5;//

         //But

//Here the problem:

Double j = 5;
Long k =5;      
Float g = 5.0;
Run Code Online (Sandbox Code Playgroud)

我知道解决方案,但我想理解为什么在某些情况下,演员是隐式完成而在其他情况下不是.

rge*_*man 7

没有任何问题

Double j = new Double(5);
Run Code Online (Sandbox Code Playgroud)

因为Java将转换5从一个intdouble一个Double构造函数将接受.它还将转换5为a double为行:

double j =5;
Run Code Online (Sandbox Code Playgroud)

这是一个扩大的原始转换.

这些线路存在问题.

Double j = 5;
Long k =5;      
Float g = 5.0;
Run Code Online (Sandbox Code Playgroud)

Java不会隐式执行扩展原始转换(5to 5.05L)和装箱转换(doubleto Doublelongto Long).它将隐式执行任一个,但不会同时执行.它也不会在这里(5.0to 5.0f)执行缩小的原始转换.

JLS,第5.2节,规定:

赋值上下文允许使用以下之一:

  • 身份转换(§5.1.1)

  • 扩展的原始转换(第5.1.2节)

  • 扩大参考转换(第5.1.5节)

  • 一个拳击转换(§5.1.7),可选地后跟一个加宽的引用转换

  • 一个拆箱转换(第5.1.8节),可选地后跟一个加宽的基元转换.

它没有明确允许最后3行试图做的事情:扩展原始转换,然后是装箱转换.

有趣的是,Java确实允许:

Number x = 5;  // boxing followed by widening
double y = new Integer(5);  // unboxing followed by widening
Run Code Online (Sandbox Code Playgroud)

  • @shekharsuman Java允许隐式扩展原始转换.`int` literal`5`将被隐式转换为`5.0`. (2认同)