我对一个小问题感到困惑,请参阅以下内容:
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)
我知道解决方案,但我想理解为什么在某些情况下,演员是隐式完成而在其他情况下不是.
没有任何问题
Double j = new Double(5);
Run Code Online (Sandbox Code Playgroud)
因为Java将转换5从一个int到double一个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.0或5L)和装箱转换(doubleto Double或longto 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)