Có giải thích hoàn hảo tại Java Lambda FAQ.
Dưới đây là một trích dẫn từ What about the diamond problem? bài viết đó:
interface A {
void m() default { ... }
}
interface B extends A {}
interface C extends A {}
class D implements B, C {}
Trong trường hợp ban đầu (mã ở trên), việc thực hiện m thừa hưởng bởi D được một cách rõ ràng rằng định nghĩa bởi Một - không có khả năng nào khác. Nếu tình hình thay đổi để B hiện cũng tuyên bố triển khai mặc định là m, sẽ trở thành việc triển khai D được kế thừa theo quy tắc "triển khai cụ thể nhất".Nhưng nếu cả hai B và C cung cấp triển khai mặc định, sau đó họ xung đột, và D phải hoặc là sử dụng cú pháp X.super.m (...) để lựa chọn một cách rõ ràng một trong số họ, nếu không redeclare các chính phương thức đó, ghi đè tất cả các khai báo siêu kiểu.
Hãy chắc chắn kiểm tra bài viết trước về quy tắc giải quyết các tuyên bố phương pháp xung đột và các bài viết khác về dự án Java Lambda - chúng khá tốt.
Nguồn
2013-05-28 09:18:12
Tôi có ấn tượng rằng bạn có thể trả lời hầu hết các câu hỏi của riêng mình chỉ bằng cách thử. –
Đúng vậy :) Thực ra tôi không thể tìm ra câu trả lời về cách xử lý vấn đề kim cương. Vì vậy, tôi đã thử nó bản thân mình. – Alex