【发布时间】:2016-06-01 20:42:37
【问题描述】:
我不明白generic wildcard bounderies 用法。
您能否解释一下为什么processList 工作得很好,而processMap 在以下示例中因编译错误而失败?我应该如何更改processMap 的签名以使其同时适用于Map<String, List<String>> 和Map<String, List<Object>>
public void processList(List<? extends Object> list) {
}
public void processMap(Map<String, List<? extends Object>> map) {
}
public void f() {
List<String> list = new ArrayList<>();
Map<String, List<String>> map = new HashMap<>();
processList(list); // OK
processMap(map); // ERROR
}
虽然将泛型类型定义从方法参数类型移动到方法参数,但成功了
public void processMap(Map<String, List<? extends Object>> map)
public <T extends Object> void processMap(Map<String, List<T>> map)
我现在想知道两者之间的区别。已移至another thread。
【问题讨论】:
-
我不知道我是否正确,但似乎 java 编译器无法解析或转换用作问题中定义的 Map 集合键的集合类型。我这样说是因为当我将函数签名修改为
public static <T extends Object> void processMap(Map<? extends Object, List<T>> map)时,它工作正常。在此类声明中使用时,<T extends Object>和<? extends Object>之间似乎存在很大差异。它的多级通配符概念。