Java分配查询

时间:2015-06-30 18:26:13

标签: java

案例1

byte b = 7; // why don't I need to cast 7 to byte in this case? byte b = (byte)7;
System.out.println(b);

输出 7

案例2

static void fun(byte b) {
   System.out.println(b);
}

public static void main(String []args) {
   fun(7); // Compiler gives error because a cast is missing here.
}

输出: 编译错误:method fun(byte) is not applicable for the argument (int).

我的问题是:为了防止案例1,7byte隐含地投放到int,而案例2则强制执行7程序员明确地施展它?

byte仍然在schemamigration frontend --auto --update 范围内。

请建议。

4 个答案:

答案 0 :(得分:2)

在情况1中,您隐式地转换为String,这是抽出到标准输出的内容。另一方面,您的函数需要一个字节,而不是整数。

答案 1 :(得分:1)

fun(7)中,7整数字面值。

试试这个:

fun((byte)7); // explicit cast, compile fine

现在回答你的问题:

案例1 byte b = 7;System.out.println(b);属于同一范围。由于7适合byte,因此无需进行显式投射,println(b)只需将byte转换为string并打印7

但在In 案例2 中,它们不在同一范围内。您使用fun Integer从一个范围调用7,其中另一个范围内的被调用函数仅取byte而不是int。因此7是否适合byte并不重要,因此编译器在程序执行System.out.println(b);之前引发错误(显式转换请求)。

答案 2 :(得分:1)

7等数字文字被视为整数。通常情况下,正如在第二种情况下,您需要投放到byte以将其传递到预期byte的位置。

fun((byte)7); // You are forced to cast here.

但是,您的第一种情况很特殊,因为您在变量初始化语句中使用此整数文字。在这种情况下,JLS中有一条允许进行隐式转换的规则。

byte b = 7; // special JLS rule applies, the cast is done for you automatically.

JLS Spec

  

此外,如果表达式是byte,short,char或int类型的常量表达式(第15.28节):

     

如果变量的类型是byte,short或char,则可以使用缩小的基元转换,并且常量表达式的值可以在变量的类型中表示。

答案 3 :(得分:0)

默认情况下,7int字面值。在第一种情况下: - byte b = 7;我们明确地将int文字7分配给byte b,因此java会对其进行隐式处理&将int 7的相应值分配给byte也是7,这意味着转换/转换是由java隐式完成的。

但在第二种情况fun(7);中,默认情况下,此处的7是int类型,但您的方法fun(byte)期望byte作为参数而不是int,并且因为java是严格类型的,它会产生错误。