Short s = 10;
这是一个Assignment Conversion
, 并且10
是一个常量表达式。JLS说:
5.2. 作业转换
赋值转换发生在将表达式的值赋给变量时:必须将表达式的类型转换为变量的类型。
……
此外,如果表达式是 byte、short、char 或 int 类型的常量表达式:
- 如果变量的类型为:
-
- Short 并且常量表达式的值可以用 short 类型表示。
takeShort(10);
这是一个Method Invocation Conversion
. JLS说:
5.3. 方法调用转换
方法调用转换应用于方法或构造函数调用中的每个参数值:参数表达式的类型必须转换为相应参数的类型。
方法调用上下文允许使用以下之一:
- 身份转换
- 扩大的原始转换
- 扩大参考转换
- 可选的装箱转换,然后是扩大的参考转换
- 一个拆箱转换可选地跟随一个扩大的原始转换。
……
如果无法通过方法调用上下文中允许的转换将表达式的类型转换为参数的类型,则会发生编译时错误。
与赋值转换不同,上面列出的非转换都可以转换int
为Short
,因此会发生编译时错误。
不幸的是,有些人在我批准之前拒绝了 kiruwka 的编辑,所以我自己编辑
方法调用转换示例:
// takeInteger(int) takeDouble(double) takeObject(Object) takeIntegerObject(Integer)
takeInteger(5); // an identity conversion
takeDouble(5); // a widening primitive conversion
takeObject(new Integer(5)); // a widening reference conversion
takeIntegerObject(5); // a boxing conversion
takeObject(5); // a boxing conversion followed by widening reference conversion
takeInteger(new Integer(5)); // an unboxing conversion
takeDouble(new Integer(5)); // an unboxing conversion followed by a widening primitive conversion.