在静态函数中返回值 - Java

时间:2013-06-18 09:37:18

标签: java

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

这很好用

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

这个不编译

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

5 个答案:

答案 0 :(得分:11)

在您的第一个示例中,sh1final,其值可以在编译时确定为“阉割”为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;

    }

Is "final" final at runtime?

答案 4 :(得分:0)

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

在您的代码中,您传递short并返回byte。所以代码应该如下,

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