Java 当方法参数为byte时,为什么必须将0强制转换为byte?
当方法参数为Java 当方法参数为byte时,为什么必须将0强制转换为byte?,java,Java,当方法参数为byte时,为什么必须将0强制转换为byte 示例: void foo() { bar((byte) 0); } void bar(byte val) {} 我知道如果参数是long类型,我不必强制转换它,所以我猜Java认为数学整数是运行时的整数 它不鼓励使用byte/short吗?因为0是int文本,从int向下转换到byte需要显式转换(因为可能会丢失信息)。您不需要从int到long的显式转换,因为在转换过程中不会丢失任何信息。文本0是一个整数,由于可能会丢失精度,
byte
时,为什么必须将0强制转换为byte
示例:
void foo() {
bar((byte) 0);
}
void bar(byte val) {}
我知道如果参数是long类型,我不必强制转换它,所以我猜Java认为数学整数是运行时的整数
它不鼓励使用byte/short吗?因为
0
是int
文本,从int
向下转换到byte
需要显式转换(因为可能会丢失信息)。您不需要从int
到long
的显式转换,因为在转换过程中不会丢失任何信息。文本0
是一个整数,由于可能会丢失精度,因此不会从整数->字节自动转换。例如,(字节)1024
超出有效范围。也许编译器可以更智能一些,允许使用小整数文本,但它不
加宽到long是可以的,因为每个整数都可以是long,而不会丢失信息
是的,出于这个原因,我几乎不会在我的代码公开的任何API中使用short或byte(尽管这对于中间计算来说很好)整数文本隐式地是
int
类型,除非它们通过L
后缀显式标记为long
。short
或byte
没有相应的标记
它不鼓励使用byte/short吗
也许是这样,这是理所当然的。使用单个字节或短字符没有任何好处,而且它们经常会导致问题,特别是自引入自动装箱以来。这里有一个类似的问题,涉及到您的问题:您正在询问差异。
(字节)Integer.MAX\u值的计算结果应该是什么?怎么样(byte)512
?@Stefan我更想问的是,为什么java不明白0将适合一个字节。我知道整数到字节可能会导致数据丢失。编译器的++1应该更适合于文本。我喜欢你的偶像,独角兽先生。这就是我想要的答案。“也许编译器可以更智能,允许使用小整数文本,但它没有”+1它根本不是编译器——它是(Java)语言规范,Java就是这样指定的。(一个行为不同的Java编译器会违反规范。)另一方面,C会很好地从最小大小的类型开始“加宽文本”,但这同样是根据(C)语言规范。@pst:那么语言规范需要更新。语义。@Stefan Kendall就我而言,整个Java语言都需要重写/重新设计;-)