我有两个功能。一个工作正常,而另一个不编译。无法查明原因。你能帮帮我吗?
这工作正常
static byte method1() {
final short sh1 = 2;
return sh1;
}
这个不编译
static byte method2(final short sh2) {
return sh2;
}
我有两个功能。一个工作正常,而另一个不编译。无法查明原因。你能帮帮我吗?
这工作正常
static byte method1() {
final short sh1 = 2;
return sh1;
}
这个不编译
static byte method2(final short sh2) {
return sh2;
}
在您的第一个示例中,sh1
isfinal
和具有可以在编译时确定为“阉割”为 a 的值byte
。实际上,它是一个常数。如果删除final
,它将不再编译。
在您的第二个示例中,编译器无法确定您的方法参数是“安全的”,您必须进行显式转换,正如其他答案所述。
有关详细信息,请参阅此处(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
第一种方法:
第一种方法是声明一个final short
变量,其值2
在byte
. 在第一种方法中,除了在编译时本身确定sh1
之外,不能保存任何其他值。2
如果删除final
,您将看到编译器抱怨。
第二种方法:
您需要转换short
为,byte
因为这是一个缩小转换,并且您必须向编译器保证您是故意这样做并知道其后果,因为final short sh2
可以具有任何应该或不应该在byte
.
static byte method2(final short sh2)
{
return (byte)sh2;
}
如果您从第一个中删除分配,也可以作为一个实验,例如
static byte method1() {
final short sh1;
return sh1;
}
然后这也不能编译。所以就像第二个一样,编译器不确定类型安全,因为值被传递给函数,如果你从第一个中删除赋值,也会发生同样的情况。
运行时的“final”final。
在方法 1
final short sh1 = 2;//// determined value at run-time.So compiles.
你必须强制转换它。你传递的是短并作为字节返回。
static byte method2(final short sh2) {
return (byte) sh2;
}
Java 是一种强类型语言。在强类型语言中,您必须执行显式类型转换。数据类型不匹配会导致强类型语言出错。
在您的代码中,您正在传递short
和返回byte
. 所以代码应该如下,
static byte method2(final short sh2)
{
return (byte) sh2;
}