2015-12-08 36 views
1

代碼給了我一個錯誤,我無法解釋爲什麼會發生這種情況。有人能解釋我做錯了什麼嗎?實際參數long不能通過方法調用轉換轉換爲int

它說long不能轉換爲int,但是當我將一個int轉換爲long時,我無法將x + multx添加爲long。

class MultCalc { 
    public static int multx(int x, int y) { 
     if (x == 0) return 0; 
     if (y == 0) return 0; 
     else return x + multx(x, y - 1); 
    } 
    public static void main(String[] args) { 
     long x = 77777; 
     long y = 1234; 
     MultCalc calc = new MultCalc(); 
     long ans = calc.multx(x, y); 
     System.out.println(x + " times " + y + " equals " + ans); 
    } 
} 

給我的錯誤。

error: method multx in class MultCalc cannot be applied to given types; 
     long ans = calc.multx(x, y); 
        ^
    required: int,int 
    found: long,long 
    reason: actual argument long cannot be converted to int by method invocation conversion 
1 error 
+0

你需要傳入一個int,在你聲明x和y的main函數中。嘗試轉換爲整數或將x和y定義爲int。 – ForeverStudent

回答

4

方法簽名爲

multx(int x, int y) 

這就是所謂的有兩個long秒。在這種情況下,long不能隱式轉換爲int

您必須創建另一種方法來接受long參數或將參數long投射到int。投射可能會導致數據丟失。

請參閱2.4.6。類型轉換和表格表2-4。 Java原始類型轉換Primitive Data Types

Convert  Convert To: 
From:  boolean byte short char int long float double 
boolean  -   N   N  N  N  N  N   N 
byte   N   -   Y  C  Y  Y  Y   Y 
short  N   C   -  C  Y  Y  Y   Y 
char   N   C   C  -  Y  Y  Y   Y 
int   N   C   C  C  -  Y  Y*  Y 
long   N   C   C  C  C  -  Y*  Y* 
float  N   C   C  C  C  C  -   Y 
double  N   C   C  C  C  C  C   - 

N:不能進行轉換。
C:表示轉換 是縮小轉換並需要顯式轉換。
Y:所述轉換是擴大轉換,並因此被Java
Y *進行 自動且隱式:表示該轉換是 自動加寬轉換,但是,一些的值的最低 顯著位數可以是由於轉換而丟失。當將intlong轉換爲floatdouble時,可能發生此 。 浮點類型具有比整數類型更大的範圍,所以 任何intlong可以由floatdouble表示。但是,浮點類型是數字的近似值,並且不能始終保持與整數類型一樣多的有效數字。

參見JLS中的Conversions and Promotions

0

根據java language specificationlong類型可以存儲從-92233720368547758089223372036854775807(含)的值。如果要將long轉換爲int,則必須執行明確的轉換,因爲int類型可以將值僅從-2147483648存儲到2147483647(含)。所以如果存儲在long變量中的值太大,信息可能會丟失。這就是所謂的Narrowing Primitive Conversion

您可以在方法調用直接做演員:

long ans = calc.multx((int)x, (int)y); 

multx返回int值,但可以將其存儲到long whitout明確造型,因爲沒有風險的方法信息丟失。 它叫做Widening Primitive Conversion

+0

這是爲什麼downvoted? – user3437460

+0

謝謝,真的很感激。 – CSStudent

+0

@CSStudent,如果你這樣做,你可以得到答案。 –

相關問題