Компилятор говорит, что метод не определен ... но это так (я думал)

1

Я пытаюсь позвонить:

public class Counter<MyClassSelectorObject> {

    final HashMap<MyClassSelectorObject, Integer> counts = new HashMap<>();

    public void add(MyClassSelectorObject t) {
        counts.merge(t, 1, Integer::sum);
        t.setCount(counts.get(t));
    }
...
}

Однако я получаю следующую ошибку от моего компилятора в Eclipse на t.setCount(counts.get(t)); :

The method setCount(Integer) is undefined for the type MyClassSelectorObject

Однако у меня есть

public class MyClassSelectorObject implements Comparable<MyClassSelectorObject>{

    ...

    public void setCount(Integer value) {
        this.count = value;
    }

    ...

}

Решение, которое предлагает функция Eclipse quickfix, заключается в том, чтобы передать t объекту, что не имеет для меня никакого смысла. Опять же, я просто возвращаюсь к кодированию через несколько лет, поэтому мне может не хватать чего-то основного здесь.

Я использую Java 8 и Eclipse Luna.

Благодарю!

  • 0
    Удаление универсального из объявления класса Counter, кажется, решает проблему, но я все еще не уверен почему (или это правильное решение).
  • 1
    MyClassSelectorObject в class Counter<MyClassSelectorObject> - это имя общего типа, а не имя вашего класса. Это так же, как если бы вы использовали T в class Counter<T> . Это означает, что в add(MyClassSelectorObject t) MyClassSelectorObject также является универсальным типом, поэтому t.setCount невозможен, поскольку t является экземпляром некоторого неизвестного универсального типа.
Показать ещё 1 комментарий
Теги:
compiler-errors

1 ответ

3
Лучший ответ

То, что вы сделали, объявлено общим классом, который имеет общий тип типа:

public class Counter<T> {

}

Кроме того, ваш T называется MyClassSelectorObject...

Таким образом, вы затеняете свой class параметром общего типа, ваш метод эквивалентен:

public void add(T t) {
    counts.merge(t, 1, Integer::sum);
    t.setCount(counts.get(t));
}

Поскольку на T нет границ, T эквивалентен Object.

Как вы уже отметили, удаление общего типа из Counter устраняет вашу проблему. Что вызывает вопросы - почему вы добавили его в первую очередь...?

  • 0
    Вау, спасибо, ребята. Мой первый вопрос StackOverflow ответил! @Boris причина в том, что я изначально написал Counter как универсальный тип, который будет считать экземпляр любого типа, с которым вы его параметризовали. Позже я попытался упростить его, чтобы он работал только с MyClassSelectorObjects, но я немного новичок в обобщениях и запутался в синтаксисе.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню