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 implements
caso
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 ClassOrInterfaceType
se usa en lugar de extends ClassType
y implements InterfaceType
para mantener las cosas simples dentro del complicado concepto. El problema es que no tenemos la palabra correcta para cubrir ambos extends
y implements
definitivamente no queremos introducir una.
<T is ClassTypeA>
<T is InterfaceTypeA>
Aunque extends
trae 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
".