Estamos acostumados
class ClassTypeA implements InterfaceTypeA {}
class ClassTypeB extends ClassTypeA {}
e qualquer pequeno desvio dessas regras nos confunde muito.
A sintaxe de um tipo ligado é definida como
TypeBound:
extends TypeVariable
extends ClassOrInterfaceType {AdditionalBound}
( JLS 12> 4.4. Variáveis de tipo>TypeBound )
Se mudássemos, certamente adicionaríamos o implementscaso
TypeBound:
extends TypeVariable
extends ClassType {AdditionalBound}
implements InterfaceType {AdditionalBound}
e termine com duas cláusulas processadas de forma idêntica
ClassOrInterfaceType:
ClassType
InterfaceType
( JLS 12> 4.3. Tipos e valores de referência>ClassOrInterfaceType )
exceto que também precisaríamos cuidar implements, o que complicaria ainda mais as coisas.
Eu acredito que é a principal razão pela qual extends ClassOrInterfaceTypeé usado em vez de extends ClassTypee implements InterfaceType- para manter as coisas simples dentro do conceito complicado. O problema é que não temos a palavra certa para cobrir tanto extendse implementse nós definitivamente não queremos introduzir um.
<T is ClassTypeA>
<T is InterfaceTypeA>
Embora extendstraga alguma confusão quando acompanha uma interface, é um termo mais amplo e pode ser usado para descrever os dois casos. Tente ajustar sua mente ao conceito de estender um tipo (não estender uma classe , não implementar uma interface ). Você restringe um parâmetro de tipo por outro tipo e não importa qual seja esse tipo. Só importa que seja seu limite superior e seu supertipo .
implements?" - "Porque só existeextends".