static void method(short x)
{
//do some stuff
}
当我使用以下行从main
方法调用上述方法时。
method(1); // compilation failed
我知道上面的调用是无效的,因为参数'x'期望短,我们传递int。
我进一步测试了上述概念并编写了另一种方法:
static short method()
{
//do some stuff
return 1;
}
但上面的方法工作正常,返回类型很短,我们返回int。 为什么第二种方法会编译?
答案 0 :(得分:29)
return
statement (JLS 14.17)能够使用assignment conversion (JLS 5.2)从原始表达式转换为返回类型。
分配转换包括将常量表达式转换为较窄类型的能力(如果它在目标类型的范围内)。因此,当值在int
范围内时,short
类型的常量表达式可以转换为short
。
方法参数不会进行赋值转换 - 它们只使用不包含此常量转换的方法invocation conversion (JLS 5.3)。
就为何这种情况而言 - 我怀疑它只是让事情更简单。赋值转换始终具有单个目标类型 - 而在方法参数的情况下,可能存在各种不同的重载需要考虑,因此必须有更多规则来确定常量表达式转换的具体方式将会。这只是一个猜测 - 它显然可以完成。 (例如,C#允许这样做。)
答案 1 :(得分:3)
你的价值恰好适合做空。尝试返回不适合16位的内容,例如大于32767的整数值,您将收到编译时错误。
答案 2 :(得分:0)
-32,768 范围内的任何数字和最大值 32,767
不应存在任何问题实际上,您可以使用short
来节省大型数组中的内存
节省内存实际上很重要。
相比之下,int
数据类型是32位带符号的二进制补码整数。它的最小值 -2,147,483,648 ,最大值 2,147,483,647 。对于整数值,除非有(即存储器节省)的原因选择其他内容,否则此数据类型通常是默认选择。此数据类型很可能足以支持您的程序使用的数字,但如果您需要更广泛的值,请改用long
。