Ну, Foo
должен быть параметризован как T
. Это T
само по себе должно расширять Bar<U>
для некоторого типа U
, так что U
расширяет Foo<T>
. (Где «extension» может означать «тот же тип, что и» в данном случае.) Я использовал U
здесь как имя произвольного типа, но оно не указано в объявлении, поэтому ?
.
Вы правы, что это немного ошеломляет, но обычно в обстоятельствах, когда подобные вещи возникают, это в конечном итоге делает вещи проще. Если вы можете привести конкретный пример, мы сможем объяснить немного более полезно.