簡體   English   中英

將方法參數傳遞給java中byte,int,int類型的方法參數

[英]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被接受而沒有強制轉換而不是方法參數。

先感謝您。

原因是當您嘗試將intbyte ,您正在進行縮小的原始轉換 由於這會導致信息丟失,因此編譯器要求您進行顯式轉換(例如,在兩種情況下,當您明確地將15轉換為byte類型時所執行的byte )。 看到這個

要回答你的另一個問題,為什么你可以簡單地聲明byte c = 15而沒有編譯錯誤,這是因為15仍然在-128到-127的范圍內,哪個byte允許。 如果您嘗試分配較大的值(如byte d = 128 ,您仍會收到編譯時錯誤。 看到這個

您的問題歸結為:

為什么將15分配給一個byte在變量聲明中起作用:

byte b = 15;

但是在調用方法時卻沒有?

subtractNumbers(15,16,17);

這是因為這兩種情況分為兩種不同的情況 第一個是在賦值上下文中,而第二個是在調用上下文中。

根據JLS§5.2賦值語境

賦值上下文允許使用以下之一:

...

此外,如果表達式是byte,short,char或int類型的常量表達式(第15.28節):

  • 如果變量的類型是byte,short或char,則可以使用縮小的基元轉換,並且常量表達式的值可以在變量的類型中表示。

15當然是一個常量表達式,因此允許從intbyte的縮小基元轉換。

但是,在調用上下文中,情況並非如此:

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節),可選地后跟一個加寬的基元轉換

沒有提到“縮小基元轉換”,因此在調用上下文中不允許這樣做。

Java有這種編譯時縮小的想法。 這允許以下內容在編譯時有效:

byte b = 15;

大多數人都被教導像12這樣的文字默認為int 這並非總是如此。 doublefloatlong等類型具有顯式文字(例如15d15f15L ),但32位以下的非浮點基元不具有。

這就是為什么15在編譯時確定為byte類型的原因。

在您的情況下,編譯器嘗試在編譯時執行類型匹配。 方法subtractNumbers有一個byteintint的方法簽名,所以你必須給它一個完全匹配。 不幸的是,在此過程中,編譯器在推斷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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM