以下代碼將在toArray()
處拋出ArrayStoreException
。假如toArray
需要V[]
並且註冊表Map鍵入的值爲Map<String,String>
,那麼編譯器是否應該沒有發現錯誤並報告了類型衝突?編譯器是否應該在泛型集合中發現這個錯誤?
private Map<String,Map<String,String>> registry;
...
registry=new TreeMap<String,Map<String,String>>(String.CASE_INSENSITIVE_ORDER));
...
void removeTargets(String[] clsarr, String hdl) {
if(clsarr==null) { clsarr=registry.values().toArray(new String[0]); }
...
}
它看起來像一個編譯器bug。
再一次,仿製藥的支持「總比沒有好,但留下了許多不足之處」。感謝您的解釋。 – 2011-05-17 20:14:36
@軟件猴子。是啊。廣泛使用的編程語言中的類型系統存在漏洞,導致錯誤可能漏過。這不是由於任何理論上的限制,而是由於Java數組類型的早期設計,它決定通過說'String []'是一個Object []'來解決方差問題,這使得它很難工作類型到試圖正確處理差異的泛型類型系統中。 – 2011-05-17 20:31:02