2016-12-20 87 views
-2

我很快就要參加考試了,我希望有人檢查我的解釋,爲什麼編譯器允許進行某些轉換,有些則不是。Java類型轉換示例

字節 - >短 - > INT - >長 - >浮動 - >雙

所以我總能投(unexplicitly)從小到從字節大即長的例子。但要朝這個方向發展< - 我必須明確說明類型轉換。到目前爲止這麼好,但考試中的問題仍然有點棘手。

int value1 = (double) 10; 

不允許。 Eclipse說不能從double轉換爲int。但是不是10個整數已經?我真的不明白。

byte value2 = (int) 120.0; 

允許。所以120.0被剪切爲120,然後是一個在一個字節範圍內的整數。但是例如下面的文件

byte value3 = (int) 33500.0; 

是不允許的。因爲它不在一個字節的範圍內?

double value4 = (int) 13.2; 

允許。 13.2被剪切爲13,這是一個整數。你總是可以從小到大分配。

int value = 10f; 

不允許。因爲你不能從float轉換爲int,但是由於現在它被明確地轉換,所以

int value = (int) 10f 

被允許。

double someValue = (int) 12.3; 

允許,我猜。但是這並沒有多大意義,是嗎?由於12.3已經是一倍。

short v1 = (int) 42.0; 

允許。但爲什麼??我以爲你不能進入這個方向。

回答

3

JLS Sec 5.2描述:

分配上下文允許使用以下中的一種:

  • 的標識轉換(§5.1.1)
  • 加寬原語轉換( §5.1.2)

...

此外,如果表達式的類型是字節,短,char或恆定表達(§15.28)INT:

  • 如果變量的類型是字節的基本收縮轉換,可以使用短,或char,並且常量表達式的值可以用變量的類型表示。

你的實施例都可以用這些規則解釋:

double value4 = (int) 13.2; 

(int) 13.2int類型,因此加寬原語轉換被應用。

int value = (int) 10f; 

(int) 10fint類型的,所以的標識轉換被應用。

double someValue = (int) 12.3; 

(int) 12.3int類型的 - 它的值是12 - 所以施加擴大原始轉換。 12.3是雙精度的事實在這裏是無關緊要的 - 你沒有將12.3分配給變量,而是分配(int) 12.3 == 12

byte value2 = (int) 120.0; 
short v1 = (int) 42.0; 

這些允許的,因爲表達式是int類型的常量和它們的值可以在byteshort分別來表示,所以基本收縮轉換情況下適用。

int value1 = (double) 10; 
int value = 10f; 

這是不允許的,因爲它需要從浮點類型收縮轉換爲int。只有一些常數整數值可以隱式縮小(不是long)。

byte value3 = (int) 33500.0; 

這是不允許的,儘管表達爲int類型的,因爲(int) 33500.0 == 33500byte的範圍之外。

+0

謝謝!我對縮小原始轉換感到非常困惑。記住原始類型的範圍可能會有幫助,不是嗎? – k725xaa

1

有兩種類型的鑄造:

  1. 隱式類型轉換(擴大轉換)
  2. 顯式類型轉換(縮小轉換)

你提到的字節序列 - >短 - - > int - > long - > float - > double用於隱式類型轉換。

Example: 
short v1 = 4; 
int i = v1; 
System.out.print(i); 

輸出:4

在我們使用(數據類型)的一個提前將其改爲其他值被稱爲顯式類型Casting.With此我們可以分配更大數據類型值更小。

Example: 
    short v1 = (int)42.0; 
    System.out.print(v1); 

輸出:42

希望你有你的答案。