2014-02-28 98 views
4

在Bruce Eckel的偉大着作Thinking in java中,有一個非常好的方法重載的示例測試,我在這裏給出了一些修改。本文作者是非常微妙的,並提到怪點:焦炭提升到INT,而不是字節;但不說原因!有人知道原因嗎?
[請看怪輸出testChar()]爲什麼在java中將`char`轉換爲`int`而不是`short`或`byte`?


public class TypeCast { 
    void f1(char x) { print("f1(char) "); } 
    void f1(byte x) { print("f1(byte) "); } 
    void f1(short x) { print("f1(short) "); } 
    void f1(int x) { print("f1(int) "); } 
    void f1(long x) { print("f1(long) "); } 
    void f1(float x) { print("f1(float) "); } 
    void f1(double x) { print("f1(double) "); } 
    void f2(byte x) { print("f2(byte) "); } 
    void f2(short x) { print("f2(short) "); } 
    void f2(int x) { print("f2(int) "); } 
    void f2(long x) { print("f2(long) "); } 
    void f2(float x) { print("f2(float) "); } 
    void f2(double x) { print("f2(double) "); } 
    void f3(short x) { print("f3(short) "); } 
    void f3(int x) { print("f3(int) "); } 
    void f3(long x) { print("f3(long) "); } 
    void f3(float x) { print("f3(float) "); } 
    void f3(double x) { print("f3(double) "); } 
    void f4(int x) { print("f4(int) "); } 
    void f4(long x) { print("f4(long) "); } 
    void f4(float x) { print("f4(float) "); } 
    void f4(double x) { print("f4(double) "); } 
    void f5(long x) { print("f5(long) "); } 
    void f5(float x) { print("f5(float) "); } 
    void f5(double x) { print("f5(double) "); } 
    void f6(float x) { print("f6(float) "); } 
    void f6(double x) { print("f6(double) "); } 
    void f7(double x) { print("f7(double) "); } 
    void testConstVal() { 
     print("5: "); 
     f1(5);f2(5);f3(5);f4(5);f5(5);f6(5);f7(5); print(""); 
    } 

    void testChar() { 
     char x = 'x'; 
     print("char: "); 
     f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x); print(""); 
    } 
    void testByte() { 
     byte x = 0; 
     print("byte: "); 
     f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x); print(""); 
    } 
    void testShort() { 
     short x = 0; 
     print("short: "); 
     f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x); print(""); 
    } 
    void testInt() { 
     int x = 0; 
     print("int: "); 
     f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x); print(""); 
    } 
    void testLong() { 
     long x = 0; 
     print("long: "); 
     f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x); print(""); 
    } 
    void testFloat() { 
     float x = 0; 
     print("float: "); 
     f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x); print(""); 
    } 
    void testDouble() { 
     double x = 0; 
     print("double: "); 
     f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x); print(""); 
    } 

    void print(Object o) { 
     System.out.println(o); 
    } 
    public static void main(String[] args) { 
     TypeCast p = new TypeCast(); 
     p.testConstVal(); 
     p.testChar(); 
     p.testByte(); 
     p.testShort(); 
     p.testInt(); 
     p.testLong(); 
     p.testFloat(); 
     p.testDouble(); 
    } 

} 
+0

你問爲什麼Java設計者按照他們的方式設計它? – joragupra

+0

可能相關:http://stackoverflow.com/q/17063436/2024761 – SudoRahul

+1

@Paul Hicks一個'char'由Java中的2個'bytes'組成 – Patrick

回答

9

char被提升到一個int,因爲這是一個可以容納所有char的價值,且不丟失精度最接近的類型。

char是一個16位無符號類型,所以既不byte也不short可以容納其所有值(字節是隻有8位; short是16位,但它是有符號的)。

+0

這是理性的,謝謝。我測試了這兩個短s = 65535; //導致錯誤。但是char c = 65535; //效果很好 – mok

+3

只是爲了記錄:規則有例外; 'int'被提升爲'float'和'long'爲'double',儘管它包含了可能的精度損失。那麼只有大小是安全保存的。 – Holger