Siamo abituati
class ClassTypeA implements InterfaceTypeA {}
class ClassTypeB extends ClassTypeA {}
e ogni leggera deviazione da queste regole ci confonde notevolmente.
La sintassi di un tipo associato è definita come
TypeBound:
extends TypeVariable
extends ClassOrInterfaceType {AdditionalBound}
( JLS 12> 4.4. Digitare variabili>TypeBound )
Se dovessimo cambiarlo, aggiungeremmo sicuramente il implementscaso
TypeBound:
extends TypeVariable
extends ClassType {AdditionalBound}
implements InterfaceType {AdditionalBound}
e finiscono con due clausole elaborate in modo identico
ClassOrInterfaceType:
ClassType
InterfaceType
( JLS 12> 4.3. Tipi e valori di riferimento>ClassOrInterfaceType )
eccetto che avremmo anche bisogno di prenderci cura di noi implements, il che complicherebbe ulteriormente le cose.
Credo che sia il motivo principale per cui extends ClassOrInterfaceTypeviene utilizzato al posto di extends ClassTypee implements InterfaceType- per mantenere le cose semplici all'interno del concetto complicato. Il problema è che non abbiamo la parola giusta per coprire entrambi extendse implementssicuramente non vogliamo introdurne uno.
<T is ClassTypeA>
<T is InterfaceTypeA>
Anche se extendsporta un po 'di confusione quando si accompagna a un'interfaccia, è un termine più ampio e può essere usato per descrivere entrambi i casi. Cerca di sintonizzare la tua mente sul concetto di estendere un tipo (non estendere una classe , non implementare un'interfaccia ). Limiti un parametro di tipo con un altro tipo e non importa quale sia effettivamente quel tipo. Importa solo che è il limite superiore ed è il suo supertipo .
implements?" - "Perché c'è soloextends".