5

我有两个功能。一个工作正常,而另一个不编译。无法查明原因。你能帮帮我吗?

这工作正常

 static byte method1() {
    final short sh1 = 2;
    return sh1;
    }

这个不编译

static byte method2(final short sh2) {
return sh2;
}
4

5 回答 5

11

在您的第一个示例中,sh1isfinal和具有可以在编译时确定为“阉割”为 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
于 2013-06-18T09:40:11.067 回答
3

第一种方法:

第一种方法是声明一个final short变量,其值2byte. 在第一种方法中,除了在编译时本身确定sh1之外,不能保存任何其他值。2如果删除final,您将看到编译器抱怨。

第二种方法:

您需要转换short为,byte因为这是一个缩小转换,并且您必须向编译器保证您是故意这样做并知道其后果,因为final short sh2可以具有任何应该或不应该在byte.

static byte method2(final short sh2) 
{ 
   return (byte)sh2; 
}
于 2013-06-18T09:38:30.357 回答
1

如果您从第一个中删除分配,也可以作为一个实验,例如

static byte method1() {
        final short sh1;
        return sh1;
        }

然后这也不能编译。所以就像第二个一样,编译器不确定类型安全,因为值被传递给函数,如果你从第一个中删除赋值,也会发生同样的情况。

于 2013-06-18T09:46:56.203 回答
0

运行时的“final”final。

在方法 1

final short sh1 = 2;////  determined value at run-time.So compiles.

你必须强制转换它。你传递的是短并作为字节返回。

static byte method2(final short sh2) { 

        return (byte) sh2;

    }

“最终”在运行时是最终的吗?

于 2013-06-18T09:38:09.360 回答
0

Java 是一种强类型语言。在强类型语言中,您必须执行显式类型转换。数据类型不匹配会导致强类型语言出错。

在您的代码中,您正在传递short和返回byte. 所以代码应该如下,

static byte method2(final short sh2) 
{ 
    return (byte) sh2;
}
于 2013-06-18T09:42:56.070 回答