เราเคยชินกับ
class ClassTypeA implements InterfaceTypeA {}
class ClassTypeB extends ClassTypeA {}
และการเบี่ยงเบนเล็กน้อยจากกฎเหล่านี้ทำให้เราสับสนอย่างมาก
ไวยากรณ์ของชนิดที่ถูกผูกไว้ถูกกำหนดเป็น
TypeBound:
extends TypeVariable
extends ClassOrInterfaceType {AdditionalBound}
( JLS 12> 4.4. ประเภทตัวแปร>TypeBound
)
หากเราต้องเปลี่ยนเราก็จะเพิ่มimplements
กรณี
TypeBound:
extends TypeVariable
extends ClassType {AdditionalBound}
implements InterfaceType {AdditionalBound}
และจบลงด้วยคำสั่งที่ประมวลผลเหมือนกันสองข้อ
ClassOrInterfaceType:
ClassType
InterfaceType
( JLS 12> 4.3. ประเภทและค่าอ้างอิง>ClassOrInterfaceType
)
ยกเว้นเราจะต้องดูแลimplements
ซึ่งจะทำให้สิ่งต่าง ๆ ยุ่งยากมากขึ้น
ฉันเชื่อว่าเป็นเหตุผลหลักที่ทำไมจึงextends ClassOrInterfaceType
ใช้แทนextends ClassType
และimplements InterfaceType
- เพื่อให้สิ่งต่าง ๆ เรียบง่ายภายใต้แนวคิดที่ซับซ้อน ปัญหาคือเราไม่มีคำที่เหมาะสมที่จะครอบคลุมทั้งสองextends
และimplements
แน่นอนเราไม่ต้องการแนะนำ
<T is ClassTypeA>
<T is InterfaceTypeA>
แม้ว่าextends
จะทำให้เกิดความยุ่งเหยิงเมื่อมันไปพร้อมกับอินเทอร์เฟซมันเป็นคำที่กว้างขึ้นและสามารถใช้เพื่ออธิบายทั้งสองกรณี พยายามปรับความคิดของคุณให้เข้ากับแนวคิดในการขยายประเภท (ไม่ขยายชั้นเรียนไม่ใช่ปรับใช้ส่วนต่อประสาน ) คุณ จำกัด พารามิเตอร์ประเภทตามประเภทอื่นและมันไม่สำคัญว่าประเภทนั้นเป็นจริง มันสำคัญแค่ว่ามันเป็นขอบด้านบนและเป็นซุปเปอร์ชนิด
implements
" - "เพราะมีเพียงextends
"