在以下代码中:
public class FooMain {
private static void foo(byte b) {}
public static void main(String args[]) throws Exception {
byte b1 = 0; // javac doesn't complain
byte b2 = 127+30000-30000; // javac apparently does arithmetic and doesn't complain
foo(0); // javac complains here and requires a cast to (byte). Why?
}
}
为什么javac
编译器会对foo
的调用抱怨,因为它显然能够推断出所提供的文字甚至文字算术表达式都可以安全地分配给byte
个变量?我正在使用Oracle javac 1.7.0_60。
答案 0 :(得分:4)
Java在前两个地方使用了一个名为Assignment conversion的东西,在这两个地方隐含地缩小数据类型是合法的。
但在第三种情况下,Java会执行一种称为方法调用转换的方法 - 它明确要求程序员指定缩小转换。
答案 1 :(得分:1)
在其他情况下,如果没有显式转换,编译器不会将int转换为字节,但如果值是静态已知常量,则编译器将自动执行转换。
这解释了所有3个案例。
使用静态已知常量
进行分配byte b1 = 0;
使用静态已知常量进行分配。计算在编译时完成。
byte b2 = 127+30000-30000;
不是作业
foo(0);