在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
,因此没有编译错误