2014-10-20 29 views
0

我沒有泛型時使用Java中的舊代碼。 HashMap的是在代碼中定義不一樣的仿製藥:在舊的Java代碼中的例外

Map A = new HashMap(); 

在這段代碼怎麼想找出放於鍵和值是什麼,如果用戶可以把不是如何將它比它的任何鍵。由於equals方法不會被覆蓋?

+0

參考值。 *不寒而慄*。 – 2014-10-20 20:43:53

+2

沒有問題。但是,如果您需要維護一個大型遺留系統,請先從添加泛型開始。使用不推薦標記更新API。使用FindBugs。因爲任何異常都必須由於某種錯誤。 – 2014-10-20 20:55:19

回答

1

不幸的是,由於沒有爲地圖定義泛型,因此不能限制可放置的內容。爲了便於比較,將調用equals方法,如果它沒有被覆蓋,那麼Object.equals將被稱爲

+0

在這種情況下,代碼完全取決於我們插入的鍵的類型,並且如果插入了不同類型的鍵(由於用戶輸入),它可能會產生異常。 – piyush 2014-10-20 20:50:30

1

即使使用泛型,用戶也可以將所有鍵/值對放入他們想要的映射中。下面的代碼編譯就好了,並在運行時將很好地工作:

Map<String,String> map = new HashMap<>(); 
(Map)map).put("key", new Double(2)); 

它只會是一個問題,當我有這樣

(String)map.get("key"); 

代碼,因爲這會在運行時導致ClassCastException

  • 如果要創建一個API,你暴露一個可變的Map泛型,你可以假設一個用戶只能將在正確的類型
  • 的值如果要創建一個API,你暴露一個可變沒有泛型的Map,您需要清楚地記錄它。在這種情況下,您可以考慮不公開地圖,而是在API上提供put方法,而不是硬編碼您接受的對象的類型
  • 如果您只是編寫自己的內部代碼並且堅持使用JDK1.4或更低,您完全可以控制該地圖中的內容。小心一點。如果您針對舊版API工作,則同樣適用。它將/應該被記錄在地圖上,你需要尊重這一點。
0

在泛型之前的日子裏,所有容器都使用Object對象。

程序員有責任確保他放入容器的所有內容都是兼容的類型。

在這種情況下,它不應該是,如果有不同的類用作鍵的對象的問題太多,因爲HashMap依靠hashCodeequals方法,以及它們是否正確寫入那些不拋出異常。

如果equals方法沒有被覆蓋,它可能使用Object的equals,它基本上比較了引用。但是應該指出的是像Integer和Date這樣的類有自己的方法equals。但是,對於不屬於同一班級的任何事情,他們不會是真的。

這樣的集合的真正問題是,當你從它們中檢索任何東西時,你必須確保你得到了正確的類型。

所以在過去,曾經有很多if (o instanceof MyClass) then...涉及集合,程序員不能控制對象的類型。

這就是爲什麼仿製藥被髮明的原因。