Câu hỏi này là cũ, nhưng tôi nghĩ rằng một giải thích rõ ràng hơn là gọi Nguyên tắc thay thế Liskov: mọi thứ đúng về một siêu lớp phải đúng với tất cả các lớp con của nó. Bạn sẽ có thể làm với một SubFoo tất cả mọi thứ mà bạn có thể làm với một Foo, và có thể nhiều hơn nữa.
Giả sử chúng tôi có Calico <: Cat <: Động vật và Husky <: Chó <: Động vật. Hãy xem một số Function[Cat, Dog]
. Những tuyên bố nào là đúng về điều này? Có hai:
(1) Bạn có thể vượt qua trong bất kỳ Cát (vì vậy bất kỳ lớp con của Cát)
(2) Bạn có thể gọi bất kỳ phương pháp Chó trên giá trị trả về
Vì vậy, hiện Function[Calico, Dog] <: Function[Cat, Dog]
có ý nghĩa ? Không, các câu lệnh đúng với siêu lớp không đúng với lớp con, cụ thể là câu lệnh (1). Bạn không thể chuyển bất kỳ con mèo nào vào một chức năng mà chỉ có mèo Calico.
Nhưng không Function[Animal, Dog] <: Function[Cat, Dog]
có ý nghĩa? Có, tất cả các câu lệnh về lớp cha đều đúng với lớp con. Tôi vẫn có thể vượt qua bất kỳ con mèo nào - trên thực tế tôi có thể làm nhiều hơn thế, tôi có thể vượt qua bất kỳ Động vật nào - và tôi có thể gọi tất cả các phương thức Dog trên giá trị trả về.
Vì vậy A <: B
ngụ ý Function[B, _] <: Function[A, _]
Bây giờ, không Function[Cat, Husky] <: Function[Cat, Dog]
có ý nghĩa? Có, tất cả các câu lệnh về lớp cha đều đúng với lớp con; Tôi vẫn có thể vượt qua trong một con mèo, và tôi vẫn có thể gọi tất cả các phương pháp Dog trên giá trị trả về - trên thực tế tôi có thể làm nhiều hơn thế, tôi có thể gọi tất cả các phương thức Husky trên giá trị trả về.
Nhưng không Function[Cat, Animal] <: Function[Cat, Dog]
có ý nghĩa? Không, các câu lệnh đúng với siêu lớp không đúng với lớp con, cụ thể là câu lệnh (2). Tôi không thể gọi tất cả các phương thức có sẵn trên Dog trên giá trị trả về, chỉ có các phương thức có sẵn trên Animal.
Vì vậy, với Function[Animal, Husky]
Tôi có thể làm mọi thứ tôi có thể làm với Function[Cat, Dog]
: Tôi có thể chuyển vào bất kỳ Mèo nào và tôi có thể gọi tất cả các phương thức Dog trên giá trị trả lại. Và tôi có thể làm nhiều hơn nữa: Tôi có thể vượt qua những con vật khác, và tôi có thể gọi những phương pháp có sẵn trên Husky mà không có sẵn trên Chó. Vì vậy, nó có ý nghĩa: Function[Animal, Husky] <: Function[Cat, Dog]
. Tham số kiểu đầu tiên có thể được thay thế bằng một siêu lớp, tham số thứ hai với một lớp con.
Cảm ơn bạn, điều đó rất rõ ràng. Cố gắng (lại) xác định: 'co/contra-variance là các thuộc tính quyết định mối quan hệ kiểu con giữa các kiểu, tùy thuộc vào bản chất của cùng quan hệ giữa các kiểu thành phần của chúng'. Tóm lại, tôi biết, nhưng tôi thích có một định nghĩa không có ví dụ (mặc dù bạn đã rất hữu ích). – bjt38
cảm ơn cho -A, bạn có thể giải thích tại sao là + B trong hàm1 [-A, + B] – liango
@liango - Anexplanation bằng ví dụ: nếu bạn trả về một 'Chuỗi' bạn chắc chắn trả về một' Object', vì vậy '. .. => String' phải là một lớp con của '... => Object'. Đó là những gì '+ B' biểu thị. –