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

Cha*_*bel 222 java byte literals

如果我有方法

void f(byte b);
Run Code Online (Sandbox Code Playgroud)

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

f(0);
Run Code Online (Sandbox Code Playgroud)

给出错误.

Rob*_*bin 274

你不能.基本数字常量被视为整数(如果后跟"L",则为long),因此必须将其明确地向下转换为一个字节以将其作为参数传递.据我所知,没有捷径.

  • 如果你正在做很多这类事情,你可以定义一个简单的辅助方法`byte b(int i){return(byte)i; 在某处并静态导入它.然后你可以写f(b(10)). (11认同)

Jon*_*eet 114

你必须施展,我害怕:

f((byte)0);
Run Code Online (Sandbox Code Playgroud)

我相信它会在编译时执行适当的转换而不是执行时间,所以它实际上不会导致性能损失.这只是不方便:(

  • +1用于编译时转换.如果你们既了解编译器又对语言设计者有信心(我们应该这样做),这是常识,但不是那么明显. (11认同)

Ric*_*igh 28

您可以在Java中使用字节文字...排序.

    byte f = 0;
    f = 0xa;
Run Code Online (Sandbox Code Playgroud)

0xa(int literal)自动转换为byte.这不是一个真正的字节文字(参见下面的JLS和评论),但如果它像鸭子一样嘎嘎叫,我称它为鸭子.

你不能做的是:

void foo(byte a) {
   ...
}

 foo( 0xa ); // will not compile
Run Code Online (Sandbox Code Playgroud)

您必须按如下方式进行投射:

 foo( (byte) 0xa ); 
Run Code Online (Sandbox Code Playgroud)

但请记住,这些都将编译,并且他们正在使用"字节文字":

void foo(byte a) {
   ...
}

    byte f = 0;

    foo( f = 0xa ); //compiles

    foo( f = 'a' ); //compiles

    foo( f = 1 );  //compiles
Run Code Online (Sandbox Code Playgroud)

当然这也是编译的

    foo( (byte) 1 );  //compiles
Run Code Online (Sandbox Code Playgroud)

  • 这些不是字节文字.它们是各种其他类型(大多数是int)的文字,它们被隐式转换为字节.例如,`1`是一个int文字,但是`double d = 1;`编译就好了. (17认同)
  • @Pacerier这是一个文字.它不是"字节文字".这是一个int.编译器将其视为int literal(应该如此)并在赋值中进行隐式向下转换(因为它也应该).在任何时候它都不会被解析为"字节文字"(它不存在).参见[JLS第5.2节](http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.2),特别是后半部分关于缩小转换.唯一涉及的是整数常量和适当的赋值转换规则应用于字节变量. (2认同)

Mik*_*key 11

如果你在代码中传递文字,那么是什么阻止你提前宣布呢?

byte b = 0; //Set to desired value.
f(b);
Run Code Online (Sandbox Code Playgroud)

  • 这也允许您为值提供更具语义的名称。http://en.wikipedia.org/wiki/Magic_number_(编程)#Unnamed_numerical_constants (2认同)

Bor*_*vić 5

怎样用

void f(int value)
{
  f((byte)value);
}
Run Code Online (Sandbox Code Playgroud)

这将允许 f(0)

  • -1这对代码的可读性非常不利。当人们实际尝试传递一个大于字节可以容纳的值时,这可能会导致问题。我不鼓励人们使用这种方法! (25认同)
  • 另外,此转换将在运行时发生。很坏。 (3认同)