繁体   English   中英

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

[英]Passing method arguments to the method parameters of type byte,int,int in java

下面的方法接受三个类型为byte,int,int参数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 */
  }

如果我将上述调用更改为subtractNumbers((byte)15,16,17); 它工作正常

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

int是byte,short,int,long的默认文字,然后为什么字节c = 15被接受而没有强制转换而不是方法参数。

先感谢您。

原因是当您尝试将intbyte ,您正在进行缩小的原始转换 由于这会导致信息丢失,因此编译器要求您进行显式转换(例如,在两种情况下,当您明确地将15转换为byte类型时所执行的byte )。 看到这个

要回答你的另一个问题,为什么你可以简单地声明byte c = 15而没有编译错误,这是因为15仍然在-128到-127的范围内,哪个byte允许。 如果您尝试分配较大的值(如byte d = 128 ,您仍会收到编译时错误。 看到这个

您的问题归结为:

为什么将15分配给一个byte在变量声明中起作用:

byte b = 15;

但是在调用方法时却没有?

subtractNumbers(15,16,17);

这是因为这两种情况分为两种不同的情况 第一个是在赋值上下文中,而第二个是在调用上下文中。

根据JLS§5.2赋值语境

赋值上下文允许使用以下之一:

...

此外,如果表达式是byte,short,char或int类型的常量表达式(第15.28节):

  • 如果变量的类型是byte,short或char,则可以使用缩小的基元转换,并且常量表达式的值可以在变量的类型中表示。

15当然是一个常量表达式,因此允许从intbyte的缩小基元转换。

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

JLS§5.3调用上下文

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

  • 身份转换(§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 这并非总是如此。 doublefloatlong等类型具有显式文字(例如15d15f15L ),但32位以下的非浮点基元不具有。

这就是为什么15在编译时确定为byte类型的原因。

在您的情况下,编译器尝试在编译时执行类型匹配。 方法subtractNumbers有一个byteintint的方法签名,所以你必须给它一个完全匹配。 不幸的是,在此过程中,编译器在推断15的类型之前不会查看可用方法的列表。 我相信这是由于方法过载造成的。

考虑一下:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM