Я работаю над проектом, и я немного застрял в одном его аспекте. Мне нужно создать класс, который может управлять коллекциями экземпляров других классов. Как часть этого, он создает объект-обертку для каждого экземпляра, который должен иметь возможность не только хранить экземпляр, но и выполнять с ним определенные операции (включая 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));
// ...
}
Сбой компиляции, с таким сообщением:
И я в растерянности. Это стирание типа на работе? Я бы так не думал - все это в одном модуле компиляции, и он не падает до HashMap<Object,Object>
- он падает до HashMap<K,V>
, что кажется странным.
Мысли? Указатели на явные упущения?
Обновление и решение:
Исходя из рекомендаций нескольких респондентов, я заменил исходную строку «добавить»:
this.map.put(new KeyWrapper<K>(key), new ValueWrapper<V>(val));
И это решило мою проблему. Примечание: один респондент предположил, что мне не нужно параметризовать KeyWrapper и ValueWrapper в строке ввода, но удаление этого приводит к появлению предупреждений «необработанного типа», поэтому я оставил их в.
Спасибо всем.