Java:加宽和自动装箱转换问题

yap*_*m01 4 java type-conversion

我不明白为什么 java 不进行扩展然后自动装箱。

Integer i = (short) 10;
Run Code Online (Sandbox Code Playgroud)

我认为会发生以下情况:

  1. 首先从10到缩小转换short
  2. short然后会扩大到int.
  3. int然后将自动装箱到Integer.

相反,它是一个编译错误。

示例 2:

短 x = 10;
整数 y = x;

这也失败了。

rge*_*man 6

根据JLS 第 5.2 节,处理赋值转换

赋值上下文允许使用以下之一:

  • 身份转换(第 5.1.1 节)

  • 扩大原始转换(第 5.1.2 节)

  • 扩大参考转换(第 5.1.5 节)

  • 装箱转换(第 5.1.7 节)可选地后跟扩展参考转换

  • 一个拆箱转换(第 5.1.8 节),可选地后跟一个扩大的原始转换。

不能同时应用两次转换(扩展原语转换和装箱转换);这里只能应用一种转换,因此它必须导致错误。

解决方案是将short返回转换为int(转换转换),这将允许分配转换为装箱转换:

Integer i = (int) (short) 10;
Run Code Online (Sandbox Code Playgroud)

(或者在这里,首先不要将其转换short为。)

Integer i = 10;
Run Code Online (Sandbox Code Playgroud)