为什么在一个应该返回简短工作的方法中返回一个int?

Vij*_*ngh 20 java

static void method(short x)
{
   //do some stuff
}
Run Code Online (Sandbox Code Playgroud)

当我main使用以下行从方法调用上述方法时.

method(1); // compilation failed
Run Code Online (Sandbox Code Playgroud)

我知道上面的调用是无效的,因为参数'x'期望短,我们传递int.

我进一步测试了上述概念并编写了另一种方法:

static short method()
{
    //do some stuff
    return 1;    
}
Run Code Online (Sandbox Code Playgroud)

但上面的方法工作正常,返回类型很短,我们返回int.为什么第二种方法会编译?

Jon*_*eet 29

return声明(JLS 14.17)能够使用赋值转换(JLS 5.2)从原来的表达式类型的返回类型转换.

赋值转换包括将常量表达式转换为较窄类型的能力(如果它在目标类型的范围内).因此int,short当值在范围内时,可以将类型的常量表达式转换为short.

方法参数不通过赋值转换 - 它们只使用方法调用转换(JLS 5.3),它不包括此常量转换.

就这种情况发生的原因而言- 我怀疑它只是让事情变得简单.赋值转换始终具有单个目标类型 - 而在方法参数的情况下,可能需要考虑各种不同的重载,因此必须有更多规则来确定常量表达式转换的具体方式.这只是一个猜测 - 显然可以做到.(例如,C#允许这样做.)

  • 我应该知道我不需要深入研究JLS.等你回答更快;-)这打开了一个有趣的问题:*为什么*他们选择了这种不一致? (3认同)