Я пытаюсь позвонить:
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.
Благодарю!
То, что вы сделали, объявлено общим классом, который имеет общий тип типа:
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
устраняет вашу проблему. Что вызывает вопросы - почему вы добавили его в первую очередь...?
MyClassSelectorObject
вclass Counter<MyClassSelectorObject>
- это имя общего типа, а не имя вашего класса. Это так же, как если бы вы использовалиT
вclass Counter<T>
. Это означает, что вadd(MyClassSelectorObject t)
MyClassSelectorObject
также является универсальным типом, поэтомуt.setCount
невозможен, посколькуt
является экземпляром некоторого неизвестного универсального типа.