![](/img/trans.png)
[英]The method write(int) in the type BufferedWriter is not applicable for the arguments (byte[])
[英]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被接受而没有强制转换而不是方法参数。
先感谢您。
您的问题归结为:
为什么将15
分配给一个byte
在变量声明中起作用:
byte b = 15;
但是在调用方法时却没有?
subtractNumbers(15,16,17);
这是因为这两种情况分为两种不同的情况 。 第一个是在赋值上下文中,而第二个是在调用上下文中。
根据JLS§5.2赋值语境 ,
赋值上下文允许使用以下之一:
...
此外,如果表达式是byte,short,char或int类型的常量表达式(第15.28节):
- 如果变量的类型是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
,那么就会有歧义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.