20
static void method(short x)
{
   //do some stuff
}

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

method(1); // compilation failed

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

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

static short method()
{
    //do some stuff
    return 1;    
}

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

4

3 回答 3

29

return语句 (JLS 14.17)能够使用赋值转换 (JLS 5.2)从原始表达式类型转换为返回类型。

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

方法参数不经过赋值转换——它们只使用不包括此常量转换的方法调用转换( JLS 5.3) 。

至于为什么会发生这种情况——我怀疑它只是让事情变得更容易推理。赋值转换总是有一个单一的目标类型——而在方法参数的情况下,可能需要考虑各种不同的重载,因此必须有更多的规则来确定常量表达式转换的具体程度。不过,这只是一个猜测——显然可以做到。(例如,C# 允许这样做。)

于 2013-05-27T09:08:57.253 回答
3

Your value happens to fit in a short. Try return something that doesn't fit in 16 bits, like a integer value larger than 32767 and you will get a compile time error.

于 2013-05-27T09:12:15.223 回答
0

-32,768最大值32,767范围内的任何数字都不应该有问题

实际上,在内存节省实际上很重要的情况下, 您可以使用 ashort在大型数组中节省内存。

相比之下,int数据类型是 32 位有符号二进制补码整数。它的最小值为-2,147,483,648,最大值为2,147,483,647。对于整数值,此数据类型通常是默认选择,除非有理由(即节省内存)选择其他类型。这种数据类型很可能对于您的程序将使用的数字足够大,但如果您需要更广泛的值,请long改用。

于 2013-05-27T12:52:58.740 回答