我注意到了令人惊讶的行为
double dPrimitive = 1; //valid line of code
这是有效的字符串和代码为我编译良好的预期结果。
Double dWrapper = 1 ; // invalid line of code
它是无效的字符串,代码没有编译 - 对我来说是未预料到的结果。
Type mismatch: cannot convert from int to Double
为什么原始扩展适用于包装器 - 不是吗?
答案 0 :(得分:0)
第一种情况:如果原语primitive widening
正在发生,int
到double
就会发生。
第二种情况:你需要装箱和拆箱,RHS应该是相应Wrapper的精确原语。
因此,您需要告诉编译器右侧的值是 double 。
Double dWrapper = 1D ; //valid now
答案 1 :(得分:0)
Double dWrapper = 1 ; // invalid
扩展功能在此示例中不起作用,因为您的语句需要扩展(从int
到double
),然后自动装箱(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