Java 集合图与树集图-什么是正确的语法?

Java 集合图与树集图-什么是正确的语法?,java,collections,map,Java,Collections,Map,我代表品牌及其相关产品,如: 切波特尔 3个迷你玉米卷 碗 玉米煎饼 饼干店 巧克力饼干 花生酱饼干 糖饼干 在代码中,这由树形图表示,因为品牌将按字母顺序排序,并且不强制执行重复的品牌或产品。由此行创建: private TreeMap<String, TreeSet<String>> products = loadProducts(RAW_PRODUCTS); 您可以看到TreeMap已成为Map,而TreeSet已成为Collection。但每当我打电

我代表品牌及其相关产品,如:

  • 切波特尔
    • 3个迷你玉米卷
    • 玉米煎饼
  • 饼干店
    • 巧克力饼干
    • 花生酱饼干
    • 糖饼干
在代码中,这由
树形图表示,因为品牌将按字母顺序排序,并且不强制执行重复的品牌或产品。由此行创建:

private TreeMap<String, TreeSet<String>> products = loadProducts(RAW_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>>)
AddAlertItem类型中的initProductList(Map)方法不适用于参数(TreeMap)
为了便于阅读,这是它混淆的区别:

Map<String,Collection<String>>
TreeMap<String,TreeSet<String>>
Map
树图
TreeSet
Collection
之间的区别在于它被绊倒了。但我不确定要做什么改变才能让它起作用。我可以向下转换方法参数来直接指定
TreeSet
,但是我觉得我会限制自己,因为我可能想在其他地方使用另一种类型的
集合

有没有什么我没有想到的,或者有没有一种方法可以在不放弃更通用的方法参数的情况下实现这一点


我在谷歌和这里搜索了一下,没有找到任何人处理这个问题。

Collection
在Collections层次结构中处于相当高的位置。为什么不加强一点API引用,改为使用
Set

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

}
void initProductList(最终地图产品){
}
这样,很明显您使用的是
Set
,而不是
List
或其他一些集合类型,因为集合的行为与列表不同


哦,它也会编译。

Collection
在Collections层次结构中处于相当高的位置。为什么不加强一点API引用,改为使用
Set

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

}
void initProductList(最终地图产品){
}
这样,很明显您使用的是
Set
,而不是
List
或其他一些集合类型,因为集合的行为与列表不同


哦,它也会编译。

恐怕@Makoto弄错了


编译代码时,jvm将删除
中的泛型类型。因此,它无法识别
TreeSet
Collection
之间的extends或implements的关系。只要泛型类型不同,编译器就会显示错误。然而,
?“扩展收藏”
将起作用。

恐怕@Makoto弄错了


编译代码时,jvm将删除
中的泛型类型。因此,它无法识别
TreeSet
Collection
之间的extends或implements的关系。只要泛型类型不同,编译器就会显示错误。然而,
?扩展集合
将起作用。

您可以按如下方式将任何集合传递给您的方法:

void initProductList(final Map<String, ? extends Collection<String>> products)
void initProductList(最终地图产品)

您可以按如下方式将任何集合传递给您的方法:

void initProductList(final Map<String, ? extends Collection<String>> products)
void initProductList(最终地图产品)

将其限制为
集合
而非
集合
,并按如下方式使用:

 void initProductList(final Map<String, ? extends Set<String>> products){}
void initProductList(最终映射产品){}

将其限制为
集合
而非
集合
,并按如下方式使用:

 void initProductList(final Map<String, ? extends Set<String>> products){}
void initProductList(最终映射产品){}

我意识到我打错了;我的意思是使用有界通配符,而不是直接使用
Set
声明。@Makoto感谢您提醒我这一点。我添加了有界通配符解决方案。我意识到我输入错误;我的意思是使用有界通配符,而不是直接使用
Set
声明。@Makoto感谢您提醒我这一点。我已经添加了有界通配符解决方案。