2013-02-20 15 views
3

假設我有一個String對象引用,並將它分配給Object引用。這將隱式執行widening在Java中加寬後縮小

Object o = "Hello World" 

現在我們不能用在任何o方法String。我的問題是,由於這種類型轉換會導致數據丟失,就像在C++中那樣,如果我們將float轉換成int,數據將會丟失。

如果我投o回到String明確我將能夠訪問實際String

在Java中有很多方法,其中有Object類型變量作爲參數。所以我可以將任何類型的對象ref傳遞給此參數。我可以通過顯式縮小這個對象來將它轉換回原始的嗎?

回答

4

對於物體,您只需簡單地將參考。該對象(String)仍保持完好。

當您將String傳遞給方法調用時,您只需將引用傳遞給它(如遇到返回值時發生的那樣)。您可以查看和使用

if (o instanceof String) { 
    String s = (String)o; 
} 

重鑄,安全地使用該字符串(請注意,如果你做這個有很多,可能指向一個不正確的對象建模,但這是另一個問題)

請注意,您也談論浮動/整數,這些都與上面不同,因爲它們是Java 原語,而不是引用。有關鑄造基元的討論,請參閱here。簡而言之,你會在這裏丟失數據。

1

如果您確定自己有String對象,則可以。但是,你甚至可以測試它運行時:

Object o = "Hello there!"; 
if (o instanceof String) { 
    String s = (String) o; 
    System.out.println("String length: " + s.length()); 
} else { 
    System.out.println("Something else: " + o.getClass().getName()); 
} 

事實上,測試是一個很好的做法,如果你不想意外ClassCastException秒。

1

假設我哈瓦字符串對象參考,我將其分配給一個 對象reference.This將隱式執行擴大

號此不進行加寬,它執行鑄造

是否因爲此類型轉換而導致數據丟失

否。對象仍然是一個字符串,不管upcast如何。在任何時候都可以將downcast回到字符串。

縮小和加寬是針對原始和參考轉換定義的。
向上轉換和向下轉換(就像您使用過的那樣)是爲了識別轉換而定義的。

2

如果你有一個返回Object類對象的方法,你可以返回字符串和Infact,你可以返回任何Java對象。沒有任何目的,簡單地投射影響表現(更多由於字符串的不變性)。事實上,如果不將對象轉換爲對象,也可以使用Object類的方法。如果您想了解更多不變性影響,請參閱Introduction – Immutable Nature – Comparison

相關問題