[英]Map of Collections vs. Map of TreeSets - what is correct syntax?
我代表品牌及其相關產品,如下所示:
在代碼中,這由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>>
TreeSet
和Collection
之間的區別在於將其絆倒。 但是我不確定要進行哪些更改才能使其正常工作。 我可以向下轉換方法參數以直接指定TreeSet
,但是隨后我覺得自己很局限,因為我可能想在其他地方使用其他類型的Collection
。
有什么我不介意的,還是在不放棄更通用的方法參數的情況下進行這項工作的方法?
我已經在Google和此處進行了一些搜索,但未找到任何處理此問題的人。
Collection
在集合層次結構中相當高。 為什么不稍微加強API參考,而改為使用Set
?
void initProductList(final Map<String, ? extends Set<String>> products) {
}
這樣,很明顯您正在使用Set
,而不是List
或其他集合類型,因為set的行為與list不同。
哦,它也會編譯。
恐怕@Makoto弄錯了。
編譯代碼時,jvm將刪除<Type>
的通用類型。 因此,它無法識別TreeSet
和Collection
之間的擴展或實現的關系。 只要泛型類型不同,編譯器就會顯示錯誤。 但是, ? 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.