【发布时间】:2013-11-22 11:22:51
【问题描述】:
我遇到了这个问题:
我们得到了一个地图界面:
interface MyMap<K,V>{
public void put (K key, V value);
public V get (K key);
public boolean containsKey (K key);
}
我们要实现一个方法addToMyMap,其签名是(我们需要填写缺失的部分(点):
void addToMyMap(MYMap<....> m, List<....> keys, .... newValue)
该方法将扫描键列表,并且对于每个键,如果它在映射中不存在,它将以 newValue 作为值添加它。
作为答案给出的实现如下:
public static <K,V> void addToMyMap (MyMap <? super K, ? super V> m, List<? extends K> keys, V newValue)
{
for (K key: keys)
{
if (!m.containsKey(key))
{
m.put(key,newValue);
}
}
}
我不完全确定为什么这个实现是正确的。如果containsKey 方法获得 K 的子类,它如何工作?这不就像在List<Fruit> 中搜索Apple 一样吗?您将如何遍历该列表?
put 方法也是如此:它如何迭代具有许多不同类型的地图?
这可能与地图的实现有关。
所以也许真正的问题是包含许多 K 和 V 超类型的映射如何知道迭代 K。
调用此方法的示例如下:
MyMap <Number, Number> m = new MyMapImpl<Number,Number>();
m.put(new Integer (1) , new Float(7.2));
m.put (new Float(3.1), new Double(9.99));
List<Integer> lst = new List<Integer>();
lst.add(1); lst.add(2); lst.add(3);
Float f = new Float (55.5);
Util.addToMyMap (m,lst,f);
这个包含浮点数和整数的映射如何查找浮点类型的键(在 put 和 containsKey 中)?
我希望得到一些解释。
【问题讨论】:
标签: java generics wildcard bounded-wildcard