Что касается синтаксиса объявления границ, архитекторы языка, добавившие обобщения в Java 5, столкнулись со следующим выбором:
- Зеркально отразить структуру объявления (с отдельными
extends
и implements
bounds) или - Выберите одну форму для ограниченных сверху типов (например,
T extends Foo
, T <: Foo
, et c.)
Последняя была (разумно , IMO) рассматривается как более прагматичный выбор c, так как в момент объявления переменной типа, является ли супертип классом или интерфейс не материален, и имеет суетливый синтаксис, который требует от клиентов использовать именно Правильное ключевое слово (и сделало бы составные границы, такие как <T extends ArrayList implements Serializable
> еще более уродливым), скорее всего, будет рассматриваться как просто усложняющее использование, без реальной выгоды для авторов или читателей кода.
Такое решение часто принимается по мере развития языка, где строгое соответствие с прецедентом только усложнит ситуацию, не принося никакой пользы, и поэтому иногда дизайнеры языка (после тщательного рассмотрения плюсов и минусов обеих альтернатив) выбирайте порвать с прецедентом ради лучшего результата.