2013-02-21 59 views
1

我正好碰上了一塊代碼蒙上a Lista MultiKeyMap調用,需要一個MultiKeyMap作爲參數的方法:爲什麼在將List轉換爲MultiKeyMap時不會收到編譯錯誤?

someMethod ((MultiKeyMap) myList); 

myListList

當然,它在運行時會拋出ClassCastException。爲什麼它沒有顯示編譯錯誤或至少一個警告「類型安全:未檢查的投射」,因爲當試圖將Collection轉換爲Map?兩種類型都沒有共同之處。

+0

如果您嘗試使用數組列表而不是列表(接口),您會得到預期的編譯器錯誤。 – Perception 2013-02-21 12:55:39

回答

7

這不是一個編譯錯誤,因爲有可能是一個List實現,也恰好是一個MultiKeyMap

public MyHybrid extends MultiKeyMap implements List { 
    // implement stuff 
} 

我並不是說這是一個好主意,但類型系統不防止它。因此編譯器允許轉換。

它不是一個未經檢查的轉換的原因是因爲目標類型沒有泛型類型參數(即沒有0​​)。

+0

因此,你總是可以將界面投射到任何你想要的東西?它從未想過我。 – 2013-02-21 13:02:47

+0

@LuisSep:是的,你可以。編譯器允許任何在理論上可以在運行時成功執行的強制轉換。 – 2013-02-21 13:03:29

相關問題