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

Posted

技术标签:

【中文标题】隐式类型转换不适用于方法参数?【英文标题】:Implicit type cast not working for method parameters? 【发布时间】:2015-02-09 08:09:45 【问题描述】:

考虑以下代码sn-p:

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)

  


我认为上面的代码 sn-p 是不言自明的。当 int 文字赋值给 byte 类型时,编译器会自动执行所需的转换。当我们使用 int 字面量调用采用 byte 参数的方法时,同样的事情不会发生。为什么?

【问题讨论】:

你不能。基本数字常量被视为整数,因此您必须将其显式向下转换为字节才能将其作为参数传递。据我所知,没有捷径。 Source 【参考方案1】:

这是赋值上下文 (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 更具体的类型,但如果您认为文字是 int 类型,那么 @987654327 @ 重载需要转换,而 int 重载不需要。

通过使byte 重载根本不适用,问题就被消除了。

【讨论】:

同意“重载解决方案”。替代方案:在L之外引入字节类型后缀。 @laune:当然,这是一个很好的选择。我更多地关注已经存在的东西,而不是试图考虑补救措施:) 我不会称其为“伟大的”,那时 ...B 甚至潜伏在二进制文件中,或者 0x10B。即使是“L”也是必要的邪恶。 有时我想知道如果没有shortbyte 类型,Java 会不会更好,而只是拥有访问单词数组中的八位字节和半字的方法。能够将 8 位和 16 位数据打包到一个数组中当然很有用,但我观察到的 byteint 的唯一优势是,如果尝试存储前者,编译器就不会发出声音变成byte[]

以上是关于隐式类型转换不适用于方法参数?的主要内容,如果未能解决你的问题,请参考以下文章

Scala隐式转换

自定义类型转换

Scala隐式转换

Scala 学习笔记之隐式参数和隐式转换并用

Scala隐式转换

scala中隐式转换之总结