如何在Java中指定字节文字?


238

如果我有方法

void f(byte b);

如何在不强制转换的情况下使用数字参数来调用它?

f(0);

给出一个错误。


1
@oliholz令人垂头丧气,并有额外的分析开销
本·巴尔凯

Answers:


284

你不能。基本数字常量被认为是整数(如果后面跟有“ L”,则为长整数),因此必须将其显式下转换为字节,以将其作为参数传递。据我所知,没有捷径可走。


11
如果您正在做很多这样的事情,则可以在byte b(int i) { return (byte) i; }某个地方定义一个简单的帮助程序方法,并将其静态导入。然后可以写f(b(10))。
Yona Appletree,

125

恐怕您必须投下:

f((byte)0);

我相信它将在编译时而不是执行时执行适当的转换,因此实际上不会造成性能损失。只是不方便:(


11
+1用于编译时转换。如果您既了解编译器又对语言设计者有信心(这是我们应有的话),这是常识,但除此之外并不那么明显。
菲利普·吉恩

31

您可以在Java中使用字节字面量。

    byte f = 0;
    f = 0xa;

0xa(int文字)自动转换为字节。它不是真正的字节文字(请参阅下面的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

17
这些不是字节文字。它们是隐式转换为字节的各种其他类型(主要是int)的文字。例如,1是一个int文字,但是double d = 1;编译就很好。
smehmood 2014年

如果您已经在使用技巧。具有静态导入的内容byte b(int i){},则b(1)比静态导入的时间长,且难度小f=1
Elazar Leibovich 2014年

1
@smehmood,但是由于转换是由预编译器/编译器(在程序甚至开始运行之前)而不是运行时完成的,所以它是一个文字,不是吗?
Pacerier 2014年

2
@Pacerier这是一个文字。它不是“字节文字”。它是一个int。编译器将其视为int文字(应如此),并在赋值中进行隐式向下转换(也应如此)。决不会将其解析为“字节文字”(不存在)。请参阅JLS的5.2节,尤其是关于缩小转换的后半部分。唯一涉及的是整数常量,并将适当的赋值转换规则应用于字节变量。
Jason C

我给这个答案+1是因为该技术是新颖的,但实际上,Java中没有“字节文字”。

12

如果要在代码中传递文字,是什么使您无法简单地提前声明它?

byte b = 0; //Set to desired value.
f(b);

1
这也使您可以为值赋予更多的语义名称。en.wikipedia.org/wiki/…–
亚伦·朗

这很有用。如果您尝试使用Java的'fill'方法填充字节数组,这是最明智的。

但是,编译器只是抱怨以下内容,我需要添加演员表: public static final byte BYTE_MASK = ( byte )0xff;
Marvo 2012年

而且我意识到我真的很想byte BYTE_MASK = 0x000000ff;避免我遇到一些讨厌的符号扩展错误。
Marvo 2012年

5

怎样用

void f(int value)
{
  f((byte)value);
}

这将允许 f(0)


26
-1这对代码的可读性非常不利。当人们实际尝试传递一个大于字节可以容纳的值时,这可能会导致问题。我不鼓励人们使用这种方法!
罗夫·ツ

3
另外,此转换将在运行时发生。很坏。
BrainSlugs83 2015年

完全同意Rolf(Tsu)的观点,也许值得补充一下,从技术上讲,它是过载,而不是覆盖。
Cromax '17

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.