在Java中将方法参数传递给类型为byte,int,int的方法参数

以下方法接受三个类型的参数,byte,int,int并且从另一个方法调用该方法,这会导致编译错误,该方法参数不适用于该方法int,int,int。默认情况下,在完成显式转换之前,字节参数是无法识别的。


 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而不转换而不是方法参数。


慕盖茨4494581
浏览 668回答 3
3回答

胡说叔叔

您的问题可以归结为:为什么分配15到byte的变量声明的作品:byte b = 15;但是在调用方法时不是吗?subtractNumbers(15,16,17);这是因为这两种情况处于两种不同的上下文中。第一个在分配上下文中,而第二个在调用上下文中。根据JLS§5.2分配上下文,分配上下文允许使用以下之一:...此外,如果该表达式是类型为byte,short,char或int的常量表达式(第15.28节):如果变量的类型为byte,short或char,并且常量表达式的值可以表示为变量的类型,则可以使用缩窄的原始转换。15当然是一个常数表达式,因此允许从int到的原始转换范围越来越窄byte。但是,在调用上下文中,情况并非如此: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节)(可选),然后进行扩大的原始转换没有提到“缩小原始转换”,因此在调用上下文中是不允许的。

萧十郎

原因是因为当您尝试将intto转换为to时byte,您正在执行缩小的原始转换。由于这可能会导致信息丢失,因此编译器要求您进行显式强制转换(即,就像您byte在两种情况下显式强制转换为15类型时所做的一样)。要回答另一个问题,为什么您可以简单地声明byte c = 15而没有编译错误,这是因为15仍在byte允许的-128到-127范围内。如果您尝试分配一个较大的值(例如)byte d = 128,则仍然会遇到编译时错误。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java