隐式类型转换不适用于方法参数?
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”也是必要的邪恶。 有时我想知道如果没有short
和byte
类型,Java 会不会更好,而只是拥有访问单词数组中的八位字节和半字的方法。能够将 8 位和 16 位数据打包到一个数组中当然很有用,但我观察到的 byte
与 int
的唯一优势是,如果尝试存储前者,编译器就不会发出声音变成byte[]
。以上是关于隐式类型转换不适用于方法参数?的主要内容,如果未能解决你的问题,请参考以下文章