Общие методы Java: супер не может быть использован? - PullRequest
10 голосов
/ 06 декабря 2011

Итак, у меня есть этот метод:

protected void collectSelectedItems(ListSelectionModel lsm, 
         Collection<? super MyItemClass> result) {
    for (int i : GUI.getSelectionIndices(lsm))
    {
        result.add(getItemByDisplayIndex(i));
    }
}

Я бы хотел вернуть коллекцию вместо использования метода void:

protected <T super MyItemClass> Collection<T> 
  collectSelectedItems(ListSelectionModel lsm, Collection<T> result) {
    for (int i : GUI.getSelectionIndices(lsm))
    {
        result.add(getItemByDisplayIndex(i));
    }
    return result;
}

с намерением сделать что-то подобное(где MyItemClass extends MyItemBaseClass):

List<MyItemBaseClass> list = 
   collectSelectedItems(lsm, new ArrayList<MyItemBaseClass>());

но я получаю синтаксическую ошибку на super:

Синтаксическая ошибка на токене "super", ожидаемая

Что дает?Можно это исправить?

Ответы [ 3 ]

5 голосов
/ 06 декабря 2011

Вот одна ссылка, которая объясняет, почему это не разрешено:

http://www.angelikalanger.com/GenericsFAQ/FAQSections/TypeParameters.html#FAQ107

Это просто говорит о том, что использование super в параметрах типа «ничего вам не покупает», посколькуразрешено, стирание, вероятно, просто сотрет его до Object, что не имеет особого смысла.

2 голосов
/ 06 декабря 2011

Вот две идеи.Первый возвращает только общий Collection, второй возвращает фактический result -тип:

public <T, S extends T> Collection<T> ver1(Collection<S> src, Collection<T> dst)
{
    dst.addAll(src);
    return dst;
}

public <U, T extends Collection<U>, S extends U> T ver2(Collection<S> src, T dst)
{
    dst.addAll(src);
    return dst;
}
1 голос
/ 06 декабря 2011

хорошо, я не ответил точно на мой вопрос, но это приемлемое решение для моей проблемы:

protected <T extends Collection<? super MyItemClass>> 
  T collectSelectedItems(ListSelectionModel lsm, T result) {
    for (int i : GUI.getSelectionIndices(lsm))
    {
        result.add(getItemByDisplayIndex(i));
    }
    return result;
}
...