Ключевое слово extends
в Generics имеет несколько отличную семантику, чем общее ключевое слово extends
.
При использовании extends
в контексте Generics, например T extends Something
, это означает, что T
должен быть типом, который либо реализует интерфейс Something
(в случаях, когда Something
является интерфейс), или является подклассом Something
(в случае, если Something
- это класс).
Возможно, причина в том, что если ключевое слово implements
было поддержано в Generics, это сделало бы объявление параметра типа слишком подробным.
Например, вы бы:
<T extends SomeClass implements Serializable & Observable>
Вместо этого, действительный синтаксис для этого будет:
<T extends SomeClass & Serializable & Observable>
И вам не нужно иметь implements
ключевое слово, на самом деле. При определении границ типа T
вам просто нужно указать, какие типов имеет тип T
, не заботясь, если это интерфейсы или классы.
Определение типа не является определением класса. Вы можете рассмотреть определение типа как объединение нескольких наборов данных, где результирующий набор - ваш тип T
.