我有两个功能。一个工作正常,而另一个不编译。无法发现原因。你能帮帮我吗?
这很好用
static byte method1() {
final short sh1 = 2;
return sh1;
}
这个不编译
static byte method2(final short sh2) {
return sh2;
}
答案 0 :(得分:11)
在您的第一个示例中,sh1
为final
,其值可以在编译时确定为“阉割”为byte
。实际上,这是一个常数。如果删除final
,它将不再编译。
在你的第二个例子中,编译器无法确定你的方法参数是“安全的”,你必须像其他提到的答案一样进行显式投射。
有关详细信息,请参阅here(JLS参考和所有)。但是一个简单的例子:
final byte b1 = 127;
final byte b2 = 1;
final byte b = b1 + b2; // <-- FAIL: 128 greater than Byte.MAX_VALUE
final byte b1 = 12;
final byte b2 = 3;
final byte b = b1 + b2; // <-- SUCCESS: 15 fits
答案 1 :(得分:3)
第一种方法:
您在final short
范围内声明值为2
的{{1}}变量的第一种方法。第一个方法中的byte
不能保存除编译时自身确定的sh1
以外的任何其他值。如果删除2
,您将看到编译器抱怨。
第二种方法:
您需要将final
转换为short
,因为这是一个缩小的转换,您必须向编译器保证您有意识地执行此操作并了解其后果,因为byte
可以具有任何值应该或不应该在final short sh2
范围内。
byte
答案 2 :(得分:1)
同样作为实验,如果您从第一个删除分配,例如
static byte method1() {
final short sh1;
return sh1;
}
然后这也不能编译。所以就像第二个一样,编译器不确定类型的安全性,因为值传递给函数,如果从第一个中删除赋值,也会发生同样的情况。
答案 3 :(得分:0)
“最后”在运行时决赛。
方法1
final short sh1 = 2;//// determined value at run-time.So compiles.
你必须施放它。你正在传递短路并以字节形式返回。
static byte method2(final short sh2) {
return (byte) sh2;
}
答案 4 :(得分:0)
Java是一种强类型语言。在强类型语言中,您必须执行显式类型转换。数据类型不匹配会导致强类型语言出错。
在您的代码中,您传递short
并返回byte
。所以代码应该如下,
static byte method2(final short sh2)
{
return (byte) sh2;
}