2013-02-18 4 views
2

Я новичок в java и пытаюсь понять любопытный синтаксис ниже из книги Java Generics and Collections .. (Я много работал с шаблонами C++ и, следовательно, мог претендовать на понимание основ общего программирования и вероятных ошибок):В чем разница между «? Extends E» и «T extends E»?

interface Collection <E> { 
    ... 
    public boolean addAll(Collection<? extends E> c); 
    ... 
} 

Почему не выше можно записать в виде:

interface Collection <E> { 
    ... 
    public boolean addAll(Collection<T extends E> c); 
    ... 
} 

в чем разница? Это просто ограничение языка или есть какая-то разница под капотом?

ответ

6

Это может быть написана как

public <T extends E> boolean addAll(Collection<T> c) 

, но не было бы никакого смысла. Нет необходимости указывать этот параметр.

+2

Вы имеете в виду 'public boolean addAll (Collection c);' –

+1

Я остановил это, чтобы обратить ваше внимание на мой предыдущий комментарий. –

+0

Теперь исправлено. –

3

Было бы разумно, если бы метод возвращал что-то типа T. Тогда вы могли бы сопоставить оба типа. Но поскольку он просто возвращает логическое значение, вам не нужно это делать. Тогда нет необходимости задавать имя T и оно остается как знак вопроса.

Скажут addAll принимает фильтр:

public <T extends E> boolean addAll(Collection<T> c, Predicate<T> aFilter); 

Теперь вы знаете, что предикат имеет общий тип, который может работать на сбор с.