我正在从事一个项目,但在其中一个方面稍有停留。我需要创建一个可以操纵其他类实例集合的类。作为其一部分,它为每个实例创建一个包装对象,该对象不仅必须能够保存该实例,而且还必须对其执行某些操作(包括equals / hashcode)。
因此,构造函数不仅接受包装的对象,还接受调用者告诉我们可以按所需方式执行这些操作的功能对象(这可能与所包含对象的本机行为不同)。
顺便说一句,我知道我在这里描述的内容听起来像是我在重塑Collections框架的一部分,但是我在这里进行了简化。
public class MapWrapper<K,V> {
private class KeyWrapper<K> {
K key;
public KeyWrapper(K key) {
// ...
}
}
private class ValueWrapper<V> {
V value;
public ValueWrapper(V value) {
// ...
}
}
// ...
HashMap<KeyWrapper<K>, ValueWrapper<V>> map
= new HashMap<KeyWrapper<K>, ValueWrapper<V>> ();
// ...
到目前为止,一切似乎还可以,但是我似乎无法将条目添加到所包含的地图中:
public MapWrapper (HashMap<K, V> map) {
// ...
map.put(new KeyWrapper<K>(key), new ValueWrapper<V>(val));
// ...
}
这将导致编译失败,并显示以下消息:
“类型为HashMap 的put(K,V)方法不适用于参数(HashPlus.KeyWrapper,HashPlus.ValueWrapper)
我很茫然。这种擦除工作吗?我不这么认为-都在同一个编译单元中,并且没有放入
HashMap<Object,Object>
-而是放入HashMap<K,V>
,这似乎很奇怪。有什么想法吗?明显遗漏的指针?
更新和解决方案:
根据一些响应者的建议,我将原始的“添加”行替换为:
this.map.put(new KeyWrapper<K>(key), new ValueWrapper<V>(val));
这解决了我的问题。注意:一位响应者建议,我不需要在放置行上参数化KeyWrapper和ValueWrapper,但是将其删除会产生“原始类型”警告,因此我将其保留。
谢谢大家。
最佳答案
put(..)
而不是add(..)
KeyWrapper
和ValueWrapper
添加到map参数,而不是map字段。使用this.map.put(..)
KeyWrapper
和ValueWrapper
。 K
和V
已经可以通过MapWrapper
获得