我正在尝试创建一个 HashMap 版本,如果输入重复键,它不会替换该值,但实际上将两个相应的值添加在一起。键值必须是类型,Number
以便可以进行添加。但是,它似乎不明白 myV
是 type Number
,或者至少在我尝试调用super.put
. 就好像V
inHashMap
实际上与V
我声明的不一样extend Number
。
这里发生了什么?
public class AdditiveMap<K, V extends Number> extends HashMap<K, V>
{
@Override
public V put(final K key, final V value)
{
if (containsKey(key))
// Second param Found 'Number', required 'V'
super.put(key, (Number)(get(key).intValue() + value.intValue()));
else
super.put(key, value);
}
}
不要Map
在put
方法中创建一个这样做的。该Map.put
方法的契约是(强调我的):
将指定值与此映射中的指定键相关联(可选操作)。如果映射先前包含键的映射,则旧值将替换为指定值。(当且仅当 m.containsKey(k) 返回 true 时,才称映射 m 包含键 k 的映射。)
因此,您的地图将违反界面契约。
当然,您可以自由添加AdditiveMap.addValuesTogether
(或其他)方法。但是你最好只使用现有的merge
方法:
map.merge(key, newValue, v -> v + newValue);
这样做的主要好处是,这个相同的语法适用于所有数字类型(嗯,int
,long
,float
和double
,你需要的铸造short
,char
并且byte
因为他们扩大至int
当您添加它们,您可以通过使用避免了明确的投v -> v += newValue
); 但实际上你不能做你想做的一般性的事情(没有提供一个Merger<V>
策略,可以将 a 添加V
到另一个V
; 与使用这种现有方法相比,这只是非常重量级)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句