我沒有泛型時使用Java中的舊代碼。 HashMap的是在代碼中定義不一樣的仿製藥:在舊的Java代碼中的例外
Map A = new HashMap();
在這段代碼怎麼想找出放於鍵和值是什麼,如果用戶可以把不是如何將它比它的任何鍵。由於equals方法不會被覆蓋?
我沒有泛型時使用Java中的舊代碼。 HashMap的是在代碼中定義不一樣的仿製藥:在舊的Java代碼中的例外
Map A = new HashMap();
在這段代碼怎麼想找出放於鍵和值是什麼,如果用戶可以把不是如何將它比它的任何鍵。由於equals方法不會被覆蓋?
不幸的是,由於沒有爲地圖定義泛型,因此不能限制可放置的內容。爲了便於比較,將調用equals方法,如果它沒有被覆蓋,那麼Object.equals將被稱爲
在這種情況下,代碼完全取決於我們插入的鍵的類型,並且如果插入了不同類型的鍵(由於用戶輸入),它可能會產生異常。 – piyush 2014-10-20 20:50:30
即使使用泛型,用戶也可以將所有鍵/值對放入他們想要的映射中。下面的代碼編譯就好了,並在運行時將很好地工作:
Map<String,String> map = new HashMap<>();
(Map)map).put("key", new Double(2));
它只會是一個問題,當我有這樣
(String)map.get("key");
代碼,因爲這會在運行時導致ClassCastException
。
Map
泛型,你可以假設一個用戶只能將在正確的類型Map
,您需要清楚地記錄它。在這種情況下,您可以考慮不公開地圖,而是在API上提供put
方法,而不是硬編碼您接受的對象的類型在泛型之前的日子裏,所有容器都使用Object對象。
程序員有責任確保他放入容器的所有內容都是兼容的類型。
在這種情況下,它不應該是,如果有不同的類用作鍵的對象的問題太多,因爲HashMap
依靠hashCode
和equals
方法,以及它們是否正確寫入那些不拋出異常。
如果equals
方法沒有被覆蓋,它可能使用Object的equals
,它基本上比較了引用。但是應該指出的是像Integer和Date這樣的類有自己的方法equals
。但是,對於不屬於同一班級的任何事情,他們不會是真的。
這樣的集合的真正問題是,當你從它們中檢索任何東西時,你必須確保你得到了正確的類型。
所以在過去,曾經有很多if (o instanceof MyClass) then...
涉及集合,程序員不能控制對象的類型。
這就是爲什麼仿製藥被髮明的原因。
參考值。 *不寒而慄*。 – 2014-10-20 20:43:53
沒有問題。但是,如果您需要維護一個大型遺留系統,請先從添加泛型開始。使用不推薦標記更新API。使用FindBugs。因爲任何異常都必須由於某種錯誤。 – 2014-10-20 20:55:19