quy tắc liên quan trong spec:
http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.1.4
Một lớp C trực tiếp phụ thuộc vào một loại T nếu T được đề cập trong mở rộng hoặc thực hiện khoản của C hoặc là một lớp cha hoặc superinterface , hoặc như một vòng loại của một tên siêu lớp hoặc siêu bề mặt.
http://java.sun.com/docs/books/jls/third_edition/html/interfaces.html#9.1.3
Một giao diện tôi trực tiếp phụ thuộc vào một loại T nếu T được đề cập trong mệnh đề của tôi hoặc là kéo dài như một superinterface hay như một vòng trong vòng một tên superinterface.
Do đó nếu A extends|implements B.C
, A phụ thuộc vào cả hai C
và B
. Spec sau đó cấm phụ thuộc vòng tròn.
Động lực bao gồm B
trong sự phụ thuộc không rõ ràng. Như bạn đã đề cập, nếu B.C
được thăng cấp lên cấp cao nhất C2
, không có nhiều khác biệt với hệ thống kiểu liên quan, vậy tại sao A extends C2
là ok, nhưng không được A extends B.C
?Cấp một loại lồng nhau B.C
không có một số truy cập prviledged nội dung của B
, nhưng tôi không thể tìm thấy bất cứ điều gì trong spec mà làm cho A extends B.C
phiền hà.
Vấn đề duy nhất là khi C
là một lớp bên trong. Giả sử B=A
, A extends A.C
nên bị cấm, bởi vì có sự phụ thuộc vòng tròn của "trường hợp kèm theo". Đó có lẽ là động lực thực sự - để cấm lớp ngoài từ lớp kế thừa bên trong. Các quy tắc thực tế được tổng quát hơn, bởi vì chúng đơn giản hơn và thậm chí còn có ý nghĩa tốt cho các lớp không bên trong.
Âm thanh như trình nạp lớp sẽ phải đọc lớp đầu tiên để biết giao diện cần xác định lớp ở vị trí đầu tiên ... Tôi không biết chi tiết về tải lớp, nhưng có vẻ khá rõ ràng. –
@donneo: vì trình biên dịch phàn nàn về "sự phụ thuộc tuần hoàn" Tôi tưởng tượng nó đã biết loại nào được định nghĩa trong lớp bên trong. Nó có vẻ giống như một hạn chế tùy ý đối với tôi. –
@PhilipK: bạn đang sử dụng trình biên dịch nào? Mine (Oracle JDK 6 và 7) chỉ phàn nàn rằng họ "không thể tìm thấy biểu tượng". Ngoài ra: câu hỏi hay, vì một giao diện lồng nhau không thực sự * dựa vào lớp bên ngoài theo bất kỳ cách thức kỹ thuật nào, điều này * có thể * là hợp pháp. –