请考虑以下代码段:
class TypeCast{
public static void main(String[] args){
byte by = 4; //compiler casts int literal to byte
doCasting(4); //Compilation Error: external type casting is required. WHY ?
}
public static void doCasting(byte by){
}
}
我认为上面的代码片段是不言自明的。当int
文字赋值为byte
类型时,编译器会自动执行所需的强制转换。当我们调用一个使用int literal byte
参数的方法时,不会发生同样的事情。为什么呢?
答案 0 :(得分:14)
这是转化时分配上下文(JLS 5.2)和调用上下文(JLS 5.3)之间的区别。
分配上下文转换包括:
此外,如果表达式是byte,short,char或int类型的常量表达式(第15.28节):
- 如果变量的类型是byte,short或char,则可以使用缩小的基元转换,并且常量表达式的值可以在变量的类型中表示。
调用上下文转换中不存在。
我不清楚为什么语言是这样设计的,除了可能简化重载分辨率 - 如果你有:
doCasting(5);
...
doCasting(int x) {}
doCasting(byte b) {}
那么你可以争论它们中的任何一个是“最佳匹配” - byte
是一种比int
更具体的类型,但如果你认为文字属于{{1}类型},然后int
重载需要转换,而byte
重载则不需要。
如果int
过载根本不适用,则会移除该问题。