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 implements
caso
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 ClassOrInterfaceType
viene utilizzato al posto di extends ClassType
e implements InterfaceType
- per mantenere le cose semplici all'interno del concetto complicato. Il problema è che non abbiamo la parola giusta per coprire entrambi extends
e implements
sicuramente non vogliamo introdurne uno.
<T is ClassTypeA>
<T is InterfaceTypeA>
Anche se extends
porta 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
".