Это будет использоваться следующим образом:
class X implements A<X> { /* ... */ }
Другими словами, вы вынуждены сделать параметр A
самого класса X
, а что-то вроде class X implements A<Unrelated>
запрещено.
Эта конструкция предоставляет интерфейсу доступ к X
через универсальный параметр, а ограничение типа гарантирует, что оно не будет использовано неправильно. Например, теперь можно предположить, что T
предоставляет все методы, которые A
делает.
Обратите внимание, что эта конструкция формально чем-то похожа на любопытно повторяющийся шаблон в C ++ (хотя технически он совершенно другой). На обоих языках это позволяет «базовому классу» рассуждать о его конечном производном использовании.