2012-03-07 50 views
1

這是我在Java中從未真正理解的東西。可以說我有:爲什麼你不能將一個整數轉換爲字符串?

int x = 4; 

現在我不能做到這一點

functionThatRequiresString(x)functionThatRequiresString((String)x)

現在我無法通過,需要一個字符串變量x的功能。我也無法將它從int轉換爲字符串。現在這樣做的正常途徑是:

Integer.toString(x)String.valueOf(x)

現在爲什麼我這樣做,雖然?

functionThatRequiresString(""+x)

這是如何從鑄造到字符串整數不同?

+0

好問題IMO。 – 2012-03-07 15:50:34

回答

3

Casting意味着你告訴編譯器「我在這裏有一個類型A的對象,但是我希望你把它當作是類型B.不要給出錯誤,因爲它看起來不像B給你「。

鑄造不會進行任何轉換(至少不適用於非原始類型)。如果在運行該程序時,該對象確實不是B類型,則會得到ClassCastException

你不能施放的intString因爲int根本就不是一個String - 你可以告訴編譯器假裝它是,但你會得到一個ClassCastException當你運行該程序。

你給將轉換(不投)的intString其他的例子。

+0

謝謝,我對鑄造的理解始終是你從一種數據類型轉換到另一種數據類型。所以我的理解是,這不是一個簡單的定義。 – Halfwarr 2012-03-07 15:58:02

1

將int轉換爲String在Java中根本不可能。在表達:

functionThatRequiresString(""+x) 

沒有鑄造,發生的事情是,你撥打+運算符返回字符串,如果它的一個參數的是一個字符串。

2

鑄造具有特定的含義,即更改引用的類型,但決不會引用該對象的類型或內容。

""+x有一個只涉及字符串的特定用例。您不能以這種方式轉換爲任何其他數據類型。

Java沒有從一種類型的對象到另一種類型的對象「鑄造」的概念。

+0

...以及「+ x」的工作可能被某些人認爲是語言設計時的糟糕決定。 – 2012-03-07 15:53:11

+0

鑑於你可以做'「一個」+ X「,這似乎符合邏輯,但很多人都同意你的看法。 – 2012-03-07 16:24:41

1

簡短的回答是,你不能intString因爲String不是父母或子女類的int。投射是關於如何查看不同相關類中的對象。

你真的問(我認爲)是爲什​​麼Java自動不爲轉換之間的類型嗎?

答案和你不能這樣做的原因functionThatRequiresString(x)是因爲Java是type safe,並且堅持你將正確的值傳遞給方法。這樣做的好處是,當你將錯誤的類型傳遞給一個函數,但是它正悄無聲息地轉換爲正確的類型時,你不會很難找到一些錯誤,所以你編譯代碼時運行起來很奇怪。如你所見,不利的一面是,當你想要執行轉換時,它不太方便。

可以做事情的原因喜歡"" + x是因爲這是一種常見操作,編譯器會爲您處理所有轉換。正如你在這裏顯式創建一個字符串,轉換是安全的。

+0

+1謝謝,我對鑄造的理解始終是你從一種數據類型轉換到另一種數據類型。所以我的理解是,這不是一個簡單的定義。 – Halfwarr 2012-03-07 15:59:25

3

只是爲了完整性,我們可以看一下編譯後的字節碼:

int i = 1; 
String s1 = "" + i; 
String s2 = Integer.toString(i); 

使用JDK 1.5.0_16(古我知道,但新的JDK不會是不同的,我認爲),將編譯爲:

0: iconst_1 
    1: istore_1 
    2: new  #2; //class java/lang/StringBuilder 
    5: dup 
    6: invokespecial #3; //Method java/lang/StringBuilder."<init>":()V 
    9: ldc  #4; //String 
    11: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    14: iload_1 
    15: invokevirtual #6; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder; 
    18: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 
    21: astore_2 
    22: iload_1 
    23: invokestatic #8; //Method java/lang/Integer.toString:(I)Ljava/lang/String; 
    26: astore_3 

所以,當你使用s1 = "" + i",你實際上做的是:

s1 = new StringBuilder().append("").append(i).toString(); 

(它會創建一個新對象並調用append(String),然後調用StringBuilderappend(int)方法,然後將其轉換爲字符串。

所以喜歡的Integer.toString(int)更有效率......

+0

謝謝你有興趣看看「+ x是做什麼的。 – Halfwarr 2012-03-07 16:13:19