2011-11-13 109 views
4

有人能告訴我這裏發生了什麼事嗎?它看起來像myObj被轉換爲String [],因此它可以在for循環中迭代。但它被構造爲新的String [] - 爲什麼它需要被施放?for-each syntax cast

public static void main(String args[]) { 
    Object myObj = new String[]{"one", "two", "three"}; 
    for (String s : (String[])myObj) { 
     System.out.print(s + "."); 
    } 
} 

謝謝!

+1

因爲它被聲明爲'Object' –

回答

5

這並不重要,它創建爲String[];您只有一個Object參考。這與每個都無關;以下不會編譯:

Object myObj = new String[]{"one", "two", "three"}; 
System.out.println(myObj.length); // There is no Object.length 
+0

是的,當然。謝謝。 – m0therway

0

爲什麼不聲明數組爲實際類型?像這樣:

Syting[] myObj = new String[]{"one", "two", "three"}; 

這樣一來,中投沒有必要

2

當你宣佈myObjObject,你告訴它忘記,這是其他任何東西。

0

表觀類型和實際類型之間存在差異。 Object myObj []語句告訴Java你正在聲明一個Object數組。在編譯時,這是Java感興趣的唯一類型。稍後當您嘗試訪問數組的元素時,Java將假定爲Object而不是其他任何東西。該字符串被稱爲實際類型,並且僅在運行時「已知」。因此鑄造的原因。

0

在編譯時檢查您試圖遍歷的對象的類型。在編譯時,唯一可用的信息是變量的聲明類型。編譯器無法[可靠地,總是]發現你實際上在其中放了一個String [](谷歌「停止問題」以瞭解原因)。
運行時類型信息用於多態性,類型轉換,可能還有其他我現在無法想到的事情。