为什么在尝试将Double
初始化为int
时会出现错误,即使它在使用基元类型double
时没有引发异常?
Double a = 1; // error - incompatible types
Double b = 1.0; // OK
double c = 1; // OK
为什么类Double
和基本类型double
之间的行为不同?
答案 0 :(得分:9)
将Double
初始化为:
Double a = 1;
需要做两件事:
int
至Integer
Integer
扩展到Double
虽然拳击很好,但从Integer
到Double
的扩展无效。所以,它无法编译。
请注意,Java不支持扩展,后跟 Boxing 转换,如JLS §5.2:
中所述分配上下文允许使用以下之一:
- 身份转换(第5.1.1节)
- 扩大原始转换(第5.1.2节)
- 扩大参考转换(第5.1.5节)
- 拳击转换(§5.1.7),可选地后跟加宽 参考转换
- 取消装箱转换(第5.1.8节),可选地后跟加宽 原始转换。
你的2 nd 分配通过拳击转换 虽然3 rd 分配通过扩展转换。
答案 1 :(得分:0)
这是因为Java的自动装箱会将1转换为整数而不是双倍。
Double a = Double.valueOf(1);
应该有效
答案 2 :(得分:0)
因为自动拳击
Double a = 1; equals to Double a = Integer.valueOf(1);
Double b = 1.0; equals to Double b = Double.valueOf(1);
double c = 1; equals to double c = (double) 1;
您还可以使用D
标记您的号码。
Double d = 1D; equals to Double d = Double.valueOf(1);