4

我遇到了这个问题:

我们得到了一个地图界面:

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 中)?

我会很感激一些解释。

4

1 回答 1

4

这被称为The Get and Put Principleextends当你只从结构中获取值时使用super通配符,当你只将值放入结构时使用通配符,当你同时获取和放置时不要使用通配符

这个包含浮点数和整数的映射如何查找浮点类型的键(在 put 和 containsKey 中)?

奇怪的短语? super K意味着目的地Map可能有任何类型的元素,它是 的超类型K这称为下界通配符,它​​将未知类型限制为特定类型或该类型的超类型。

例如,List<Integer>比前者List<? super Integer>仅匹配 Integer 类型的列表,而后者匹配属于Integer.


对于您的上下文MyMap <Number, Number> m,它的类型是和Number的超类型。所以它可以包含 type和. 甚至也是。因为它们都是. 超类型实例总是可以引用子类型。IntegerFloatIntegerFloatDoubleNumber

请检查:

  1. 下界通配符
  2. 通配符使用指南
于 2013-11-22T11:26:32.350 回答