Estamos acostumbrados a
class ClassTypeA implements InterfaceTypeA {}
class ClassTypeB extends ClassTypeA {}
y cualquier ligera desviación de estas reglas nos confunde enormemente.
La sintaxis de un tipo enlazado se define como
TypeBound:
extends TypeVariable
extends ClassOrInterfaceType {AdditionalBound}
( JLS 12> 4.4. Variables de tipo>TypeBound )
Si tuviéramos que cambiarlo, seguramente agregaríamos el implementscaso
TypeBound:
extends TypeVariable
extends ClassType {AdditionalBound}
implements InterfaceType {AdditionalBound}
y terminan con dos cláusulas procesadas idénticamente
ClassOrInterfaceType:
ClassType
InterfaceType
( JLS 12> 4.3. Tipos de referencia y valores>ClassOrInterfaceType )
excepto que también tendríamos que cuidarnos implements, lo que complicaría aún más las cosas.
Creo que es la razón principal por la que extends ClassOrInterfaceTypese usa en lugar de extends ClassTypey implements InterfaceTypepara mantener las cosas simples dentro del complicado concepto. El problema es que no tenemos la palabra correcta para cubrir ambos extendsy implementsdefinitivamente no queremos introducir una.
<T is ClassTypeA>
<T is InterfaceTypeA>
Aunque extendstrae algo de desorden cuando va junto con una interfaz, es un término más amplio y puede usarse para describir ambos casos. Intente sintonizar su mente con el concepto de extender un tipo (no extender una clase , no implementar una interfaz ). Usted restringe un parámetro de tipo por otro tipo y no importa cuál sea ese tipo en realidad. Solo importa que sea su límite superior y su supertipo .
implements?" - "Porque solo hayextends".