隐式类型转换不适用于方法参数?

时间:2015-02-09 08:09:46

标签: java casting

请考虑以下代码段:

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参数的方法时,不会发生同样的事情。为什么呢?

1 个答案:

答案 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过载根本不适用,则会移除该问题。