2014-01-12 55 views
0

我們假設變量startstop都是長型變量。Java:長時間投射到int

int diff = (int) start-stop; 

此代碼產生了錯誤Type mismatch: cannot convert from long to int,而

int diff = (int) (start-stop); 

運行正常。爲什麼?

+0

第二種情況下,您將(啓動 - 停止)第一種情況的結果投入開始 –

+0

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls- 15.7 –

回答

3

因爲在第一,(int)適用於start,不表達,如:

int diff = ((int) start) - stop; // <== Your first expression clarified 

然後就從所得int減去long,而且表達的結果是一個long。 (如果已經工作,它可能將不得不給予你一個不正確的結果,如果start曾經有過大在int存儲值的副作用。)

通過先做減法和獲得long結果,然後將其轉換爲int,您可以將其存儲在您的int變量中。 (大概你知道它適合你的應用邏輯。)

1

因爲Java不允許隱含縮小轉換。一個將在第一種情況下是需要的,因爲它是等效於:

int diff = ((long)(int)start) - stop; 
0
int diff = (int) start - stop; 

等於

int diff = (int) (long) start - (long) stop; // we substract long types 

可以簡化爲

int diff = (int) start - (long) stop; // (int)(long) x means (int) x 

等於

int diff = ((int) start) - (long) stop; // casting is applied only to start 

等於

int diff = ((long)(int) start) - (long) stop; // compiler make types equal 

可以簡化爲

int diff = (long) start - (long) stop; // we can substract now 

等於

int diff = (long) startMinusStop; // because long - long => long 

在這裏我們是可讀的錯誤Type mismatch: cannot convert from long to int

+1

非常好的分解 –

0

在您的第一個聲明中,您只會將變量start轉換爲整數。所以結果是int - long這是一個很長的,不適合整數。它會像int = (int - long)和java不會允許。