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 implements
caso
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 ClassType
e implements InterfaceType
- para manter as coisas simples dentro do conceito complicado. O problema é que não temos a palavra certa para cobrir tanto extends
e implements
e nós definitivamente não queremos introduzir um.
<T is ClassTypeA>
<T is InterfaceTypeA>
Embora extends
traga 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
".