在java中将方法参数传递给byte、int、int类型的方法参数

在java中将方法参数传递给byte、int、int类型的方法参数,java,methods,casting,byte,Java,Methods,Casting,Byte,下面的方法接受三个类型为byte,int,int的参数,并且从另一个方法调用该方法,该方法会产生编译错误,即方法参数不适用于int,int,int。默认情况下,在显式转换完成之前,不会识别byte参数 public double subtractNumbers(byte arg1,int arg2,int arg3) { double sum=arg1+arg2+arg3; return sum; } 现在方法调用另一个方法,如下所示 public void call(){

下面的方法接受三个类型为
byte,int,int
的参数,并且从另一个方法调用该方法,该方法会产生编译错误,即方法参数不适用于
int,int,int
。默认情况下,在显式转换完成之前,不会识别byte参数

 public double subtractNumbers(byte arg1,int arg2,int arg3) {
    double sum=arg1+arg2+arg3;
    return sum;
}
现在方法调用另一个方法,如下所示

 public void call(){
  subtractNumbers(15,16,17);   /*Compile error,but 15 is in byte acceptable 
 range of -128 to 127 */
  }
如果我将上述调用更改为
减法数字((字节)15,16,17)工作正常

当我将一个变量声明为
byte c=15
时,它被接受,但当15被传递给一个byte参数时,为什么会出现编译错误

int是byte,short,int,long的默认文本,那么为什么不使用强制转换而接受byte c=15,而不接受方法参数


先谢谢你

原因是,当您尝试将
int
强制转换为
字节时,您正在进行缩小原语转换。由于这可能导致信息丢失,编译器要求您执行显式强制转换(即,就像您在两种情况下显式将15强制转换为
byte
类型时所做的那样)。看


为了回答您的另一个问题,即为什么可以简单地声明
byte c=15
,而不产生编译错误,这是因为
15
仍然在
byte
允许的-128到-127范围内。如果您试图分配一个较大的值,例如
字节d=128
,您仍然会得到编译时错误。请参见

您的问题归结为:

为什么将
15
赋值给
字节
在变量声明中起作用:

byte b = 15;
但不是在调用方法时

subtractNumbers(15,16,17);
这是因为这两种情况处于两种不同的背景下。第一个在赋值上下文中,而第二个在调用上下文中

据报道,

分配上下文允许使用以下内容之一:

此外,如果表达式为常数表达式(§15.28),则 键入byte、short、char或int:

  • 如果变量的类型为byte、short或char,并且常量表达式的值为 可表示为变量的类型
15
当然是一个常量表达式,因此允许从
int
byte
的缩小原语转换

但是,在调用上下文中,情况并非如此:

严格调用上下文允许使用以下内容之一:

  • 身份转换(§5.1.1)
  • 扩大原语转换(§5.1.2)
  • 拓宽参考转换(§5.1.5)
松散调用上下文允许更宽松的转换集, 因为如果没有,它们只用于特定的调用 可以使用严格的调用上下文找到适用的声明。 松散调用上下文允许使用以下内容之一:

  • 身份转换(§5.1.1)
  • 扩大原语转换(§5.1.2)
  • 拓宽参考转换(§5.1.5)
  • 装箱转换(§5.1.7)后可选加宽参考转换
  • 取消装箱转换(§5.1.8)后可选地进行加宽原语转换

没有提到“缩小原语转换范围”,因此在调用上下文中不允许这样做。

Java有这种压缩编译时的思想。这允许以下内容在编译时有效:

byte b = 15;
大多数人都被教导,像
12
这样的文本将默认为
int
。这并不总是正确的。像
double
float
long
这样的类型有显式文字(例如
15d
15f
15L
),但32位以下的非浮点原语没有

这就是为什么
15
在编译时被确定为类型
byte

在您的例子中,编译器试图在编译时执行类型匹配。方法
subtractNumbers
的方法签名为
byte
int
int
,因此必须为其提供精确匹配。不幸的是,在此过程中,编译器在推断
15
的类型之前没有查看可用方法的列表。我相信这是由于方法过载

考虑这一点:

public static void test(byte a, int b){}
public static void test(int a, int b){}

现在,如果调用
test(15,16)
,如果
15
允许自动缩小到
byte
,那么就会出现歧义。

猜测这是因为方法重载:可以使用另一个
subtractNumbers
方法,第一个参数是int,在这种情况下,
subtractNumbers(15,16,17)
将调用第二个。通过执行
(byte)15
byte c=15
您将此
int
值向下转换为
byte
,因此没有编译错误