2013-03-21 64 views
2

我正在接收大量的擴展我的對象的對象的數組列表。我想將它們插入散列表中以加快參考。我決定創建一種避免重複代碼的方法,因爲它經常發生,並且只是爲了好玩,我希望變得更加花哨,並使用泛型。我知道有幾種方法可以做到這一點,但沒有一個看起來很乾淨或漂亮。我想知道如果我錯過了一個更簡單的解決方案。所以,我想要做這樣的事情...使用泛型向hashmap添加集合

private void addToMap(Collections<? extends myObject> collection, Map<String, ? extends myObject> map){ 

    for(MyObject myObject: collection){ 
    map.put(myObject.getName(), myObject); 
    } 
} 

方法的合同將要求集合作爲地圖將會提供存儲相同的類。我很好,如果方法拋出一個異常是有人打破該合同,並嘗試傳入兩個存儲myObject的不同實現,然後存儲地圖的集合。

上面的代碼失敗了,因爲我不能將'myObject'放入期望「?extends MyObject」來鼓勵類型安全的集合中。我很好,只是投了它,但他們只知道如何投射它,涉及到幾個難看的反射步驟,似乎令人費解。我也可以創建某種內部類來讓我可以使用更強大的泛型(強制收集和映射以存儲相同類型),但它也感覺過度殺傷。

那麼,是否有一種簡單或漂亮的方式以最直觀的方式創建此方法?我知道我可以完全拋棄泛型,只是拋出一切東西,我只是想弄清楚一個更優雅的方法。

+4

應該?擴展myObject'而不是'?擴展MyObject'? – 2013-03-21 01:06:32

+0

@RichardJPLeGuen:不是,它應該是'?超級MyObject「。 – 2013-03-21 02:11:54

回答

3

這聽起來像你想以下幾點:

private <T extends MyObject> void addToMap(
     Collection<T> collection, 
     Map<String, ? super T> map 
) { 
    for (T myObject : collection) { 
     map.put(myObject.getName(), myObject); 
    } 
} 

更多信息:

+0

如果你想讓這個解決方案更加靈活,你可以使用'Collection '。 – Jeffrey 2013-03-21 01:09:17

+0

@Jeffrey我認爲,但它不會給調用者增加更多的靈活性,因爲它已經決定了'T'。感謝編輯順便說一句。 – 2013-03-21 01:10:51

+0

@Jeffrey你刪除你的答案的任何理由?我正要放棄我的並且贊成它。 – 2013-03-21 01:12:12

0

我認爲這取決於。

泛型被設計和適合於某些senarios,其中,所述客戶端代碼和服務代碼被緊緊地收縮爲四通型換乘評價。所以泛型只是爲我們提供了預編譯時安全在這種情況下當客戶端代碼做一個愚蠢的鑄造一個錯誤的類型,並輸入他們Genrics收集也並非絕對安全,方便。正如我們所知,集合在運行時會崩潰,但在編譯時可以。

泛型適合在某些情況下,這我們自己可以保證一些對象,並將它們加入泛型集合是正確的,他們甚至不能unifed或澆鑄到一個超強力式。在這種情況下,我們可以通過使用原始類型集合或使用一些集合(如List<Object>)來忽略泛型。這是正確的路要走。 我想你可能是在這種情況下