我有以下 map
Map<Integer, ? extends Collection<Integer>> map
有时有一个List
,有时有一个Set
作为值。现在我想获取值,但是有一个问题,它无法编译。
Collection<Integer> value = map.getOrDefault(1, Collections.emptyList())
我知道我可以做这样的事情:
Collection<Integer> value = map.get(1);
if (value == null) {
value = Collections.emptyList();
}
但我想了解 getOrDefault()
方法应该如何与通配符泛型一起使用。
最佳答案
这是一个竞争非常激烈的案例 - 简而言之,你不能做 getOrDefalt()
使用上限值。
default V getOrDefault(Object key, V defaultValue)
作为第二个参数,getOrDefalt()
需要 V
类型的实例。这意味着参数应该与其声明方式的 Value 类型完全匹配,在本例中为 ? extends Collection<Integer>
.
我们无法使用通配符执行类型转换。此代码在语法上无效:
Collection<Integer> value =
m.getOrDefault(1, (? extends Collection<Integer>) Collections.emptyList()); // will not compile
无法提供所需类型的默认值。
关于java - 作为映射值的上限通配符 - 如何使用 getOrDefault() 提供默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72593183/