Дженерики и коллекции - метод не определен для типа - PullRequest
3 голосов
/ 05 октября 2009

Я работаю над проектом, и я немного застрял в одном его аспекте. Мне нужно создать класс, который может управлять коллекциями экземпляров других классов. Как часть этого, он создает объект-обертку для каждого экземпляра, который должен иметь возможность не только хранить экземпляр, но и выполнять с ним определенные операции (включая 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 в строке ввода, но удаление этого приводит к появлению предупреждений «необработанного типа», поэтому я оставил их в.

Спасибо всем.

Ответы [ 2 ]

5 голосов
/ 05 октября 2009

Ошибка говорит само за себя. Метод, который вы ищете, называется put, а не add.

4 голосов
/ 05 октября 2009
  1. это put(..) не add(..)
  2. вы пытаетесь добавить KeyWrapper и ValueWrapper к параметру карты, а не к полю карты. Используйте this.map.put(..)
  3. вам не нужно параметризовать KeyWrapper и ValueWrapper. K и V уже доступны через MapWrapper
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...