我工作的一个项目,我稍微停留在它的一个方面。我需要创建一个可以操纵其他类的实例集合的类。作为其中的一部分,它为每个实例创建一个包装器对象,该对象必须能够保存实例,但对其执行某些操作(包括equals/hashcode)。泛型和集合 - 方法未定义类型
所以构造不仅需要被包装的对象,而且还包括来电者告诉我们,可以按所需的方式(这可以从包含的对象原生的行为有所不同)执行这些操作的函数对象。
顺便说一句,我知道什么,我在这里描述听起来像我重塑集合框架的一部分,但我在这里简单。
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));
// ...
}
这失败的编译,此消息:
-
“方法把(K,V)放入类型HashMap < 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进行参数化,但是将其除去会产生“原始类型”警告,因此我已将它们留下。
感谢所有。
您使用的是现代的IDE像Eclipse,Netbeans的或的Intelli-J?如果你是这样,你不应该陷入这种类型的问题,因为它们提供方法完成,你会看到add()方法不存在。 – SteveD 2009-10-05 12:12:37
但我还补充说,我们都一直在那里寻找一个问题的超复杂的原因,发现最后这是一件愚蠢的事情;-) – SteveD 2009-10-05 12:15:30
D'oh!事实上,我正在使用一个现代化的IDE - 特别是Eclipse ...而我仍然错过了它。我认为这是一个类型问题。谢谢。 – CPerkins 2009-10-05 12:30:22