Array和ArrayList的Clone為什麽一個不用類型轉換,一個要類型轉換
阿新 • • 發佈:2018-03-11
分析 original 調用 super 不用 轉換 得出 ima 分享圖片
通過上面一段代碼可以看出Array的Clone()不用進行類型轉換,但ArrayList的Clone要進行類型轉換。為什麽會出現這種情況呢?我們來分析下源碼
現在來看下Array的Clone()方法源碼
發現Array裏沒有Clone()方法,調用的都是Object裏的方法
這裏面的除了Object並不是說Object就不遵守這個慣例,而是Object就是這個慣例的源頭,它是一定遵守的,那麽就可以得出結論
Array調用Clone是不用類型轉換的。
那麽為什麽ArrayList就要呢?我們來看下ArrayList裏的Clone()方法
調用super的Clone方法,好像也沒有問題,但問題在下面一行Arrays的copyOf()方法,我在看下copyOf()方法
發現,這裏需要original的類型,那麽original的類型又是什麽呢?我們回到上面看clone(),original對應參數elementData對象,那麽elementData是什麽類型呢?
通過這個可以看出,elementData是Object類型,original也是Object類型,通過copyOf方法返回的也是一個Object對象,所以我們得出結論
ArrayList返回的是一個Object對象,該Object使系統無法識別具體類型,所以要進行類型轉換。
Array和ArrayList的Clone為什麽一個不用類型轉換,一個要類型轉換