请考虑2种情况:

//1
Short s = 10; //obviously compiles

//2
takeShort(10); //error - int is not applicable

//where:
static void takeShort(Short s) {}

我假设情况1被编译器更改为:
short _temp_s = 10;
Short s = Short.valueOf(_temp_s);

您能否解释在情况2中编译器要做什么,所以它不编译?如果它不像情况1那样尝试应用自动装箱,那为什么呢?

编辑

johnchen902答案中对JSL的引用说明了编译器的行为。

对于字节,short,char或int类型的常量表达式,JLS不像在赋值转换中那样对方法调用转换支持JLS不支持“变窄的原始转换后跟装箱转换”的原因还不清楚。
有任何想法吗 ?

最佳答案

Short s = 10;
这是一个Assignment Conversion,而10是一个常量表达式。 JLS说:

takeShort(10);
这是一个Method Invocation ConversionJLS说:

与分配转换不同,上面列出的非转换可以将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.

10-08 08:53