2015-03-28 4 views
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; 
    } 

    ... 

} 

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

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

Спасибо!

+0

Удаление обобщения из объявления класса Counter, похоже, решает проблему, но я все еще не уверен, почему (или это правильное решение). –

+1

'MyClassSelectorObject' в' class Counter '- это имя общего типа, а не имя вашего класса. Это то же самое, что вы бы использовали 'T' в' class Counter '. Это означает, что в 'add (MyClassSelectorObject t)' MyClassSelectorObject' также является общим типом, поэтому вызов 't.setCount' невозможен, так как' t' является экземпляром некоторого неизвестного типа. – Pshemo

+0

@ Ваш комментарий был частью головоломки, которая заставила меня понять ответы ниже. Спасибо за вашу помощь! –

ответ

3

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

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, но я немного новичок в дженериках и запутался в синтаксисе. –

Смежные вопросы