Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么在一个应该返回短值的方法中返回一个int会起作用?_Java - Fatal编程技术网

Java 为什么在一个应该返回短值的方法中返回一个int会起作用?

Java 为什么在一个应该返回短值的方法中返回一个int会起作用?,java,Java,当我从mainmethod调用上述方法时,使用以下行 static void method(short x) { //do some stuff } 我知道上面的调用是无效的,因为参数“x”应该是short,而我们正在传递int 我进一步测试了上述概念,并编写了另一种方法: method(1); // compilation failed 但上面的方法工作得很好,返回类型很短,我们返回int。 第二个方法为什么要编译?能够使用从原始表达式类型转换为返回类型 赋值转换包括在目标类型范围内

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

static void method(short x)
{
   //do some stuff
}
我知道上面的调用是无效的,因为参数“x”应该是short,而我们正在传递int

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

method(1); // compilation failed
但上面的方法工作得很好,返回类型很短,我们返回int。 第二个方法为什么要编译?

能够使用从原始表达式类型转换为返回类型

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

方法参数不经过赋值转换-它们只使用不包含此常量转换的方法


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

您的价值恰好符合一个简短的条件。尝试返回不适合16位的值,例如大于32767的整数值,您将得到编译时错误。

-32768和最大值32767范围内的任何数字都不应该有问题

实际上,您可以使用
short
来保存大数组中的内存,在 节省内存实际上很重要


相比之下,
int
数据类型是一个32位有符号2的补码整数。它的最小值为-2147483648,最大值为2147483647。对于整数值,此数据类型通常是默认选择,除非有理由(即节省内存)选择其他数据类型。此数据类型很可能足够大,适合您的程序使用的数字,但如果您需要更大范围的值,请使用
long

我应该知道,我不需要深入研究JLS。等待你回答会更快;-)这就引出了一个有趣的问题:他们为什么选择这种不一致性?实际上,它应该是32768,因为短的范围是-2^15到2^15-1。@PharfarFystok:它不会像强制转换那样被截断-如果你试图返回一个不在正确范围内的常量表达式,您将得到一个编译时错误。@JonSkeet我明白了。谢谢你澄清这一点。我会更新的。
static short method()
{
    //do some stuff
    return 1;    
}