如果我有一个方法

void f(byte b);

我怎么能调用它与一个数字参数没有强制转换?

f(0);

给出一个错误。


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


用重写方法怎么样

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

这允许f(0)


如果你在代码中传递文字,是什么阻止你提前简单地声明它?

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

恐怕你得投:

f((byte)0);

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


你可以在Java中使用字节字面值…排序的。

    byte f = 0;
    f = 0xa;

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

在Java 7和更高版本中,你可以这样指定一个字节字面值: 字节字节=(字节)0b00100001;

参考:http://docs.oracle.com/javase/8/docs/technotes/guides/language/binary-literals.html