等于(=)。为什么原始扩展是有效的,但对包装器不起作用?

时间:2014-07-07 14:07:22

标签: java type-conversion wrapper primitive boxing

我注意到了令人惊讶的行为

代码1:

double dPrimitive = 1; //valid line of code

这是有效的字符串和代码为我编译良好的预期结果。

代码2:

Double dWrapper = 1 ; // invalid line of code

它是无效的字符串,代码没有编译 - 对我来说是未预料到的结果。

Type mismatch: cannot convert from int to Double

为什么原始扩展适用于包装器 - 不是吗?

4 个答案:

答案 0 :(得分:0)

第一种情况:如果原语primitive widening正在发生,intdouble就会发生。

第二种情况:你需要装箱和拆箱,RHS应该是相应Wrapper的精确原语。

因此,您需要告诉编译器右侧的值是 double

Double dWrapper = 1D ; //valid now

答案 1 :(得分:0)

Double dWrapper = 1 ; // invalid  

扩展功能在此示例中不起作用,因为您的语句需要扩展(从intdouble),然后自动装箱(double到{{1} })它是一个合法的任务。 Java将自动为您执行一个或另一个,但不是两个。

答案 2 :(得分:0)

因为要让后者工作,首先需要进行扩展操作,然后进行框操作。但是没有为对象定义扩展,仅用于基元。

允许它工作的唯一方法是首先扩展基本类型,例如int -> double -> Double,但这需要编译器强制扩展,因为它意识到结果被赋值给{{ 1}}特定的对象,如果之后只是为了盒子,这不会那么有意义。

答案 3 :(得分:0)

我找到了决定:

widening -> boxing - 无效的转化链

boxing -> wideining - 有效的转化链

此代码:

 Object  d=1;
 System.out.println(d.getClass());

返回

class java.lang.Integer