Câu hỏi từ một cuốn sách:Java 8 - Phương pháp mặc định - mối quan tâm đối với mã di sản
Trong quá khứ (pre-Java 8), bạn được cho biết rằng đó là hình thức xấu để thêm phương pháp để một giao diện vì nó sẽ phá vỡ mã hiện có. Bây giờ bạn được thông báo rằng bạn có thể thêm các phương thức mới, miễn là bạn cũng cung cấp triển khai mặc định.
- Làm cách nào an toàn? Mô tả một kịch bản trong đó phương thức
stream
mới của giao diệnCollection
làm cho mã kế thừa không biên dịch được.- Còn về tính tương thích nhị phân thì sao? Sẽ mã di sản từ một tập tin JAR vẫn chạy?"
câu trả lời của tôi là như sau nhưng tôi không hoàn toàn chắc chắn về họ.
- Đó là an toàn chỉ khi mã di sản không cung cấp một phương pháp với cùng một tên
stream
và có cùng chữ ký (ví dụ: trong một lớp cũ thực hiệnCollection
) .Nếu không, mã cũ cũ này sẽ thất bại trong việc biên dịch - Tôi nghĩ khả năng tương thích nhị phân được giữ nguyên, mã kế thừa từ tệp JAR cũ sẽ vẫn chạy Nhưng tôi không có lý lẽ rõ ràng nào về thi S.
Có ai có thể xác nhận hoặc từ chối các câu trả lời này hoặc chỉ thêm một số đối số, tham chiếu hoặc rõ ràng hơn cho các câu trả lời này không?
[Related] (http://stackoverflow.com/a/22618640/335858). – dasblinkenlight
Làm như vậy trong khi vẫn duy trì tính tương thích nhị phân là động lực chính của việc thêm các phương thức mặc định vào ngôn ngữ.Thêm một mặc định cho một phương thức hiện có là nhị phân và nguồn tương thích; thêm một phương thức mới với mặc định là nhị phân và nguồn tương thích (tương tác modulo với các phương thức xung đột trong các lớp con - điều này có các đặc tính tương thích giống nhau để thêm một phương thức mới vào một lớp không phải là cuối cùng.) –
Trong khi khả năng tương thích nhị phân được giữ nguyên, vẫn có thể vấn đề phát sinh, khi nó tương tác với hành vi thư viện JRE, như trong [kịch bản này] (http://stackoverflow.com/q/26816650/2711488). Bạn cũng có thể xem xét rằng một phương thức có thể có chữ ký * tương thích *, do đó, bắt đầu ghi đè lên một phương thức 'default' mới mà không có ý định ... – Holger