2013-11-21 28 views
2

關於原語:當我從較小類型轉換爲較大類型時,轉換是隱式的,當我從較大類型轉換爲較小類型時,我需要顯式轉換原語,這由於數據丟失而變得清晰。但有一些我不明白。當我在某些情況下(字節和短)向上或向下轉換爲char時,雖然字節(8位)適合字符(16位),但我總是需要明確地向兩個方向投射?爲什麼我需要在字節和short上顯式地轉換char原語?

(見http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

見我的例子...

public class CastingTest 
{ 
    public static void main(String[] args) 
    { 
     //casting from smaller to bigger types 
     short c = 13; 
     int d = c; 

     byte f = 34; 
     short g = f; 

     byte h = 20; 
     long i = h; 

     byte var03 = 6; 
     double var04 = var03; 

     //casting from bigger to smaller types 
     int j = 12; 
     short k = (short)j; 

     long m = 56; 
     int n = (int)m; 

     double o = 19; 
     short p = (short)o; 

     //not possible without explicit cast, but why? 
     byte var01 = 3; 
     char var02 = (char)var01; 

     short var05 = 5; 
     char var06 = (char)var05; 

     char var07 = 'k'; 
     short var08 = (short)var07; 
    } 
} 

回答

4

char是Java的只有無符號類型,因此它的值範圍不完全包含任何其他Java類型的數值範圍。

對於目標類型的範圍未完全覆蓋源類型範圍的任何轉換,您必須使用顯式轉換運算符。

+1

第二條語句並不完全正確:「float f =(int)i」不需要轉換,但它可能是有損轉換。目標類型的值範圍可能會因價值超過或下溢而需要轉換的轉化。與「損失」無關。 – Durandal

1

我已經從語言規範採取這樣的:

「首先,字節被轉換爲int經由加寬原語轉換(§5.1.2),然後將所得的INT被轉換爲字符縮小原始轉換(§5.1.3)。「

相關問題