为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕盖茨4494581 2021-05-07 17:17:38
以下方法接受三个类型的参数,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而不转换而不是方法参数。
查看完整描述

3 回答

?
胡说叔叔

TA贡献1804条经验 获得超8个赞

您的问题可以归结为:

为什么分配15byte的变量声明的作品:

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节)(可选),然后进行扩大的原始转换

没有提到“缩小原始转换”,因此在调用上下文中是不允许的。


查看完整回答
反对 回复 2021-05-19
?
萧十郎

TA贡献1815条经验 获得超13个赞

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

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


查看完整回答
反对 回复 2021-05-19
  • 3 回答
  • 0 关注
  • 667 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信