java:自动装箱和铸造?
我被一个小问题弄糊涂了,请参见以下内容:java:自动装箱和铸造?,java,autoboxing,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; 我知道解决方案,但我想了解为什么在某些情况下,强制转换是隐式进行的,而在其他情况下则不是。 Double j = new Double(5); 因为Java将5从int转换为
Double j = new Double(5); // No problem.
double j =5;//
//But
//Here the problem:
Double j = 5;
Long k =5;
Float g = 5.0;
我知道解决方案,但我想了解为什么在某些情况下,强制转换是隐式进行的,而在其他情况下则不是。
Double j = new Double(5);
因为Java将5
从int
转换为double
构造函数将采用的double
。它还将该行的5
转换为double
:
double j =5;
这是一个不断扩大的原语转换
这些线路有问题
Double j = 5;
Long k =5;
Float g = 5.0;
Java不会隐式地执行扩展原语转换(5
到5.0
或5L
)和装箱转换(double
到double
或long
到long
)。它将隐式执行其中一个,但不能同时执行两个。它也不会在此处执行缩小原语转换(5.0
到5.0f
)
报告指出:
分配上下文允许使用以下内容之一:
- 身份转换(§5.1.1)
- 扩大原语转换(§5.1.2)
- 拓宽参考转换(§5.1.5)
- 装箱转换(§5.1.7)后可选加宽参考转换
- 取消装箱转换(§5.1.8)后可选地进行加宽原语转换
Number x = 5; // boxing followed by widening
double y = new Integer(5); // unboxing followed by widening
这三个赋值的问题是,尽管Java有关于扩展原语到原语转换的规则,但它没有关于原语到包装器转换的规则。换句话说,除了自动装箱之外,没有任何规则可以进行转换
Double j = 5; // 5 is an int literal. It can be auto-boxed only to Integer
Long k =5; // Same here
Float g = 5.0; // 5.0 is a double literal. It can be auto-boxed only to Double
您可以通过添加适当的后缀或适当的强制转换来修复这些问题,如下所示:
Double j = (double)5;
Long k = 5L;
Float g = (float)5.0;
双j=新双(5);
双k=j
这里发生了拆箱。从包装器对象获取值并分配给基本数据类型(int、doulbe、float)
双k=j;等于j.doubleValue();返回类型为双精度
双j=5
如果要这样使用,必须提到数据类型,
双a=(双)5;或双a=双。值(5)
这是自动装箱。不知道数据类型不能进行java强制转换,否则您应该给出正确的原始数据类型(5.0)。code>double d=5代码>//加宽 在上面的语句中,加宽是从原语
int
到double
Double d=新的Double(5)代码>//使用包装类构造函数并将其与int
类型值5一起传递,但是返回包装类Double
referenced
并引用值5.0,因为jvm
将在int
上进行加宽
,并返回包装类Double
构造函数使用的Double
类型5.0
Double d=5.0
//是自动装箱,类似于Double d=new Double(5)代码>
但是,Double d=5
//错误,因为int
类型值5不能自动装箱到double
类型值并由double
类型引用变量引用。jvm不会对包装类引用变量所引用的值执行这样的基元类型加宽。根本不清楚您在问什么。“问题”是什么?解释什么东西不能按你期望的方式工作。我怀疑double j=5代码>将在不给出编译时警告/错误的情况下工作!!!不应该是double j=5d代码>?@shekharsuman Java允许隐式扩展原语转换。int
literal5
将被隐式转换为5.0
。有人知道为什么Java的人决定不允许隐式扩展吗?