簡體   English   中英

集合圖與樹集圖-正確的語法是什么?

[英]Map of Collections vs. Map of TreeSets - what is correct syntax?

我代表品牌及其相關產品,如下所示:

  • 辣椒醬
    • 3迷你玉米餅
    • 墨西哥卷餅
  • 餅干店
    • 巧克力曲奇
    • 花生醬曲奇
    • 糖餅干

在代碼中,這由TreeMap<String, TreeSet<String>> ,因為品牌將保持字母順序排序,並且不強制使用重復的品牌或產品。 通過此行創建:

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

我仍在學習Java,但是,在盡可能的地方使用最通用的類​​型不是好OO的准則之一嗎? 所以我有這個方法,它可以在相同的Map中進行一些處理:

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

您會看到TreeMap變為Map ,而TreeSet變為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之間的區別在於將其絆倒。 但是我不確定要進行哪些更改才能使其正常工作。 可以向下轉換方法參數以直接指定TreeSet ,但是隨后我覺得自己很局限,因為我可能想在其他地方使用其他類型的Collection

有什么我不介意的,還是在不放棄更通用的方法參數的情況下進行這項工作的方法?

我已經在Google和此處進行了一些搜索,但未找到任何處理此問題的人。

Collection在集合層次結構中相當高。 為什么不稍微加強API參考,而改為使用Set

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

}

這樣,很明顯您正在使用Set ,而不是List或其他集合類型,因為set的行為與list不同。

哦,它也會編譯。

恐怕@Makoto弄錯了。

編譯代碼時,jvm將刪除<Type>的通用類型。 因此,它無法識別TreeSetCollection之間的擴展實現的關系。 只要泛型類型不同,編譯器就會顯示錯誤。 但是, ? extends Collection<String> ? extends Collection<String>將起作用。

您可以按以下方式將任何集合傳遞給您的方法:

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

將其限制為Set而不是Collection ,並按以下方式使用它:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM