2014-09-28 30 views
1

我代表與其相關的產品品牌,像這樣:集合的地圖與TreeSet的地圖 - 什麼是正確的語法?

  • 的Chipotle
    • 3迷你玉米餅
    • 捲餅
  • 餅乾店
    • 巧克力片cookie
    • 花生醬餅乾
    • 糖餅乾

在代碼中,這是由TreeMap<String, TreeSet<String>>表示,作爲品牌將保持按字母順序排序和執行沒有重複的品牌或產品。通過這條線創建:

private TreeMap<String, TreeSet<String>> products = loadProducts(RAW_PRODUCTS); 

我還在學習Java的,而不是良好的面向對象的格言一個地方,你可以用最普通類型?所以,我有這種方法,它在這同Map和做一些處理:

void initProductList(final Map<String, Collection<String>> products) 

而且你可以看到TreeMap已成爲MapTreeSet已成爲Collection。但每當我試着撥打:

initProductList(products); 

編譯器錯誤顯示:

The method initProductList(Map<String,Collection<String>>) in the type AddAlertItem is not applicable for the arguments (TreeMap<String,TreeSet<String>>) 

,使其更易於閱讀,這是它是在混淆的區別:

Map<String,Collection<String>> 
TreeMap<String,TreeSet<String>> 

的區別之間TreeSetCollection正在絆倒它。但我不確定要改變它的工作方式。我可能 downcast方法參數直接指定TreeSet,但後來我覺得我會限制自己,因爲我可能想在其他地方使用另一種類型的Collection

有沒有我沒有想到的,或者一種方法來使這個工作沒有放棄更通用的方法參數?

我在谷歌和這裏搜索了一下,沒有找到任何人處理這個問題。

回答

2

Collection在Collections層次結構中相當高。爲什麼不加強API參考一點,用Set代替?

void initProductList(final Map<String, ? extends Set<String>> products) { 

} 

這種方式,它是明確清楚,你與Set的工作,而不是List或某些其他集合類型,集合行爲不同於名單做。

哦,它也會編譯。

2

恐怕@Makoto錯了。

編譯代碼時,jvm將刪除<Type>中的通用類型。所以它不能識別延伸執行TreeSetCollection之間的關係。只要泛型類型不同,編譯器就會顯示錯誤。但是,? extends Collection<String>將工作。

+0

我意識到,我已經輸入錯誤;我的意思是用有界的通配符而不是直接的'Set'聲明。 – Makoto 2014-09-28 05:35:16

+0

@Makoto謝謝你提醒我。我添加了有界的通配符解決方案。 – Jiang 2014-09-28 05:38:45

2

您可以通過任何收集到你的方法如下:

void initProductList(final Map<String, ? extends Collection<String>> products) 
2

限制到一個Set,而不是Collection和如下使用它:

void initProductList(final Map<String, ? extends Set<String>> products){}