![](/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.