java - 作为映射值的上限通配符 - 如何使用 getOrDefault() 提供默认值

标签 java dictionary generics bounded-wildcard

我有以下 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/

相关文章:

JAVA lo4j 正确的异常处理和日志记录

Java模块化划分

java - java中内部类可以继承外部类的扩展吗?

c# - 可能的通用实现的返回列表

swift - 无法使用完成 block 推断静态函数的泛型类型

c# - 转换泛型类型时出错

java - Google Talk API 与 Android 应用的集成

python - 按赢家/输家名称查询体育数据的数据框,并获取每个玩家的汇总统计表?

python - 如何使用列表作为 python 字典中的键

C#: IEnumerable, GetEnumerator, 请举个简单的例子!