Nei*_*ker 10 java autoboxing wrapper
只是想了解自动拳击,我做了一件事:
Short s = 250;
Long l = 250;
Run Code Online (Sandbox Code Playgroud)
分配Long l
失败.我希望这是因为你不能加宽那个盒子(即它试图将int
值加宽250
到a long
,然后将它打包,它不能这样做).
但是,作业的分配Short s
.怎么回事呢?我的假设是它还在做拳击和某种转换.但是,如果它是一个知道250
适合a的情况short
,为什么它不知道250
将适合一个long
?
axt*_*avt 12
通常,您不能在赋值中应用多个(隐式)转换(JLS§5.2赋值转换):
当表达式的值被赋值(第15.26节)给变量时,就会发生赋值转换:必须将表达式的类型转换为变量的类型.赋值上下文允许使用以下之一:
- 身份转换(§5.1.1)
- 扩展的原始转换(第5.1.2节)
- 扩大参考转换(第5.1.5节)
- 一个拳击转换(§5.1.7),可选地后跟一个加宽的引用转换
- 一个拆箱转换(第5.1.8节),可选地后跟一个加宽的基元转换.
Long l=250;
需要两次转换(扩展原始转换然后进行装箱转换),这就是它无法编译的原因.
Long l=250l;
编译,因为它需要一个拳击转换.
但缩小常量表达式的转换是一种特殊情况,这就是为什么Short s=250;
编译:
另外,如果表达式是byte,short,char或int类型的常量表达式(第15.28节):
- 如果变量的类型是byte,short或char,则可以使用缩小的基元转换,并且常量表达式的值可以在变量的类型中表示.
- 如果变量的类型是:则可以使用缩小的基元转换,然后进行装箱转换:
- 字节和常量表达式的值可在类型字节中表示.
- Short和常量表达式的值可以在short类型中表示.
- 字符和常量表达式的值可在char类型中表示.
归档时间: |
|
查看次数: |
937 次 |
最近记录: |