Chúng tôi đã từng
class ClassTypeA implements InterfaceTypeA {}
class ClassTypeB extends ClassTypeA {}
và bất kỳ sai lệch nhỏ từ các quy tắc này làm chúng ta bối rối rất nhiều.
Cú pháp của một loại ràng buộc được định nghĩa là
TypeBound:
extends TypeVariable
extends ClassOrInterfaceType {AdditionalBound}
( JLS 12> 4.4. Biến loại>TypeBound
)
Nếu chúng tôi thay đổi nó, chúng tôi chắc chắn sẽ thêm implements
trường hợp
TypeBound:
extends TypeVariable
extends ClassType {AdditionalBound}
implements InterfaceType {AdditionalBound}
và kết thúc với hai mệnh đề được xử lý giống hệt nhau
ClassOrInterfaceType:
ClassType
InterfaceType
( JLS 12> 4.3. Các loại và giá trị tham chiếu>ClassOrInterfaceType
)
ngoại trừ chúng ta cũng cần phải chăm sóc implements
, điều này sẽ làm phức tạp mọi thứ hơn nữa.
Tôi tin rằng đó là lý do chính tại sao extends ClassOrInterfaceType
được sử dụng thay vì extends ClassType
và implements InterfaceType
- để giữ mọi thứ đơn giản trong khái niệm phức tạp. Vấn đề là chúng ta không có những từ thích hợp để trang trải tất cả extends
và implements
và chúng tôi chắc chắn không muốn để giới thiệu một.
<T is ClassTypeA>
<T is InterfaceTypeA>
Mặc dù extends
mang lại một số mớ hỗn độn khi đi cùng với một giao diện, đó là một thuật ngữ rộng hơn và nó có thể được sử dụng để mô tả cả hai trường hợp. Cố gắng điều chỉnh tâm trí của bạn với khái niệm mở rộng một loại (không mở rộng một lớp , không thực hiện giao diện ). Bạn hạn chế tham số loại theo loại khác và loại đó thực sự không quan trọng. Nó chỉ quan trọng rằng nó là giới hạn trên của nó và nó là siêu kiểu của nó .
implements
?" - "Bởi vì chỉ cóextends
".