我遇到了这个问题:
我们得到了一个地图界面:
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 的子类,该方法如何工作?这不就像Apple
在 a 中搜索List<Fruit>
吗?您甚至会如何遍历该列表?
该put
方法也是如此:它如何迭代具有许多不同类型的地图?
这可能与 Map 的实现有关。
所以也许真正的问题是包含许多 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 中)?
我会很感激一些解释。