Jesteśmy przyzwyczajeni
class ClassTypeA implements InterfaceTypeA {}
class ClassTypeB extends ClassTypeA {}
a wszelkie niewielkie odstępstwa od tych zasad bardzo nas dezorientują.
Składnia powiązanego typu jest zdefiniowana jako
TypeBound:
extends TypeVariable
extends ClassOrInterfaceType {AdditionalBound}
( JLS 12> 4.4. Zmienne typu>TypeBound
)
Gdybyśmy to zmienili, z pewnością dodalibyśmy tę implements
sprawę
TypeBound:
extends TypeVariable
extends ClassType {AdditionalBound}
implements InterfaceType {AdditionalBound}
i kończą się dwiema identycznie przetworzonymi klauzulami
ClassOrInterfaceType:
ClassType
InterfaceType
( JLS 12> 4.3. Typy referencyjne i wartości>ClassOrInterfaceType
)
z wyjątkiem tego, że musielibyśmy się również zająć implements
, co jeszcze bardziej skomplikowałoby sprawę.
Wierzę, że jest to główny powód, dla którego extends ClassOrInterfaceType
stosuje się zamiast extends ClassType
i implements InterfaceType
- aby zachować rzeczy proste w skomplikowanym pojęciem. Problem polega na tym, że nie mamy odpowiedniego słowa, aby opisać jedno extends
i drugie i na implements
pewno nie chcemy go przedstawić.
<T is ClassTypeA>
<T is InterfaceTypeA>
Chociaż extends
wprowadza pewien bałagan, gdy idzie w parze z interfejsem, jest to szerszy termin i można go użyć do opisania obu przypadków. Spróbuj dostroić umysł do koncepcji rozszerzenia typu (nie rozszerzania klasy , nie implementowania interfejsu ). Ograniczasz parametr typu innym typem i nie ma znaczenia, co to właściwie jest. Liczy się tylko to, że jest to górna granica i jego nadtyp .
implements
?” - „Ponieważ jest tylkoextends
”.