2

我有以下代码:

@Override
public boolean putAll(Multimap<? extends Index, ? extends V> multimap) {
    for (Index index : multimap.keySet()) {
        putAll(index, multimap.get(index));
    }
}

multimap.get(index)编译错误在哪里:

Multimap 类型中的方法 get(capture#5-of ? extends Index) 不适用于参数 (Index)

我是否偶然发现了一个著名的仿制药陷阱?我不知道问题出在哪里。

旁注:我正在构建一个扩展 SetMultiMap 的类,因为我有特定的键匹配要求

4

3 回答 3

2

假设你输入一个Multimap<FooIndex, Integer>. 然后你有:

Multimap<FooIndex, Integer> map = ...;
Index plainIndex = ...;
Integer value = map.get(plainIndex);

这是一个类型失败,因为Multimap.get需要一个Key. 我怀疑你需要使这个方法通用:

@Override
public <Key extends Index> boolean putAll(Multimap<Key, ? extends V> multimap) {
    for (Key index : multimap.keySet()) {
        putAll(index, multimap.get(index));
    }
}

(我还没有测试过,但这更有意义,IMO。)

于 2012-08-07T13:11:07.790 回答
2

get方法的签名是

get(K key) 

您的 Multimap 声明为

Multimap<? extends Index, ? extends V> multimap

所以你不知道密钥的类型。你知道它是或者它 extends Index,但你不知道它的类型。所以传递一个实例Index是无效的。

于 2012-08-07T13:13:35.660 回答
1

您是否尝试仅使用常规MultimapEquivalence.wrap-ing 您的密钥?

于 2012-08-07T20:19:42.657 回答