案例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,7
被byte
隐含地投放到int
,而案例2则强制执行7
程序员明确地施展它?
byte
仍然在schemamigration frontend --auto --update
范围内。
请建议。
答案 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.
此外,如果表达式是byte,short,char或int类型的常量表达式(第15.28节):
如果变量的类型是byte,short或char,则可以使用缩小的基元转换,并且常量表达式的值可以在变量的类型中表示。
答案 3 :(得分:0)
默认情况下,7
是int
字面值。在第一种情况下: -
byte b = 7;
我们明确地将int文字7
分配给byte b
,因此java会对其进行隐式处理&将int 7
的相应值分配给byte
也是7
,这意味着转换/转换是由java隐式完成的。
但在第二种情况fun(7);
中,默认情况下,此处的7是int
类型,但您的方法fun(byte)
期望byte
作为参数而不是int
,并且因为java是严格类型的,它会产生错误。