如果我有一个方法
void f(byte b);
如何在不进行强制转换的情况下使用数字参数调用它?
f(0);
出现错误。
无法直接传递基本数值类型作为字节参数。因为基本数值常量被视为整数(如果后面跟着一个"L"则被视为长整数),所以您必须显式地将其强制转换为byte类型。就我所知,没有捷径可以实现这一点。
byte b(int i) {return (byte) i; }
并将其静态导入。然后你就可以写成 f(b(10))。 - Yona Appletree恐怕你需要进行类型转换:
f((byte)0);
我相信这会在编译时执行适当的转换,而不是在执行时执行,所以它实际上不会导致性能损失。只是有点不方便:(
byte f = 0;
f = 0xa;
0xa
(int字面量)会自动转换为byte。它不是真正的byte字面量(请参见JLS和下面的注释),但是如果它像鸭子一样嘎嘎叫,我就称它为鸭子。
你不能这样做:
void foo(byte a) {
...
}
foo( 0xa ); // will not compile
你必须进行如下类型转换:
foo( (byte) 0xa );
请记住,这些都将被编译,并且它们使用的是“字节文字”:
void foo(byte a) {
...
}
byte f = 0;
foo( f = 0xa ); //compiles
foo( f = 'a' ); //compiles
foo( f = 1 ); //compiles
foo( (byte) 1 ); //compiles
1
是一个int字面量,但是 double d = 1;
可以编译通过。 - smehmoodbyte b(int i){}
的情况下,b(1)
作为 long 类型会比 f=1
更加简单。 - Elazar Leibovich如果你在代码中传递字面量,那么有什么阻止你事先声明它呢?
byte b = 0; //Set to desired value.
f(b);
public static final byte BYTE_MASK = (byte)0xff;
- Marvobyte BYTE_MASK = 0x000000ff;
,以免出现一些令人讨厌的符号扩展错误。 - Marvo如果要覆盖方法,该怎么做?
void f(int value)
{
f((byte)value);
}
f(0)
。在Java 7及更高版本中,您可以通过以下方式指定字节字面量:
byte aByte = (byte)0b00100001;
参考资料:http://docs.oracle.com/javase/8/docs/technotes/guides/language/binary-literals.html