Trường hợp này có vẻ là một trường hợp góc bất chính, vì có number of bugs liên quan đến kế thừa tuần hoàn, thường dẫn đến vòng lặp vô hạn, tràn ngăn xếp và OOM trong trình biên dịch. Dưới đây là một số trích dẫn có liên quan mà có thể cung cấp một số cái nhìn sâu sắc:
Bug 4326631:
Ví dụ này là không quy phạm pháp luật, và điều này được thể hiện rõ trong thời gian tới 2nd edition của ngôn ngữ Java Specification. Các lớp đồng thời có liên quan bởi cả thừa kế và vỏ bọc đều có vấn đề, tuy nhiên, bản báo cáo lớp bên trong ban đầu không giải quyết đầy đủ vấn đề, cũng như các trình biên dịch trước 1.3 không thực hiện chính sách nhất quán. Trong ấn bản JLS 2nd , quy tắc chống lại sự thừa kế theo chu kỳ đã được mở rộng để cấm tự phân chia một lớp hoặc giao diện từ "tùy thuộc" trực tiếp hoặc gián tiếp. Loại không chỉ phụ thuộc vào các loại mà nó mở rộng hoặc triển khai, mà còn trên các loại đóng vai trò là vòng loại trong tên của các loại đó.
Bug 6695838:
Hai tờ khai lớp thực sự là cyclic; phù hợp với JLS 8.1.4 chúng tôi có mà:
Foo phụ thuộc vào Foo $ INTF (Foo $ INTF xuất hiện trong dụng cụ điều khoản của Foo)
Foo $ INTF phụ thuộc vào Moo $ INTF (Moo $ INTF xuất hiện trong mệnh đề của Foo $ INTF mở rộng)
Foo $ Intf phụ thuộc vào Foo (Foo xuất hiện như một vòng loại trong mệnh đề mở rộng của Foo $ Intf)
Vì transitivity, chúng tôi có Foo phụ thuộc vào chính nó; như vậy mã nên bị từ chối với một lỗi biên dịch thời gian.
Bug 8041994:
Đẩy mạnh trở lại, trực tiếp phụ thuộc mối quan hệ cho các lớp và các giao diện được giới thiệu vào JLS2 để làm rõ JLS1 và để trang trải superclasses/superinterfaces được lồng lớp (ví dụ AB trong Mô tả) .
Bug 6660289:
Vấn đề này là do thứ tự mà javac thực hiện ghi công của loại hình biến vọt lớp wrt ghi công.
1) Ghi công của lớp Outer < T kéo dài Outer.Inner>
1a) Ghi công của Outer gây nên ghi công của loại Outer của biến
2) Ghi công của Outer.T
2a) Ghi công của Outer.T gây nên ghi công của nó tuyên bố ràng buộc
3) Ghi công của lớp Outer.Inner < S kéo dài T>
3a) Ghi công của Outer.Inner gây nên ghi công của loại Outer.Inner của biến
4) Ghi công của Outer.Inner < S>
4a) Ghi công của Oute r.Inner.S kích hoạt thuộc tính của nó được khai báo ràng buộc
5) Attribution of Outer.T - điều này không có gì ngoài việc trả về kiểu T; như bạn có thể thấy, ở giai đoạn này T của ràng buộc chưa được đặt trên đối tượng đại diện cho loại T.
Tại thời điểm sau, đối với mỗi biến loại được gán, javac thực hiện kiểm tra để đảm bảo rằng ràng buộc của biến kiểu đã cho không đưa ra sự kế thừa tuần hoàn. Nhưng chúng ta đã thấy rằng không có ràng buộc nào được đặt cho Outer.T; cho điều này là lý do javac treo với một NPE khi cố gắng để phát hiện một chu kỳ trong cây thừa kế gây ra bởi các ràng buộc được khai báo của Outer.Inner.S.
Bug 6663588:
vọt Type-biến có thể tham khảo các lớp học thuộc về một cây thừa kế theo chu kỳ mà làm cho quá trình giải quyết để vào một vòng lặp khi nhìn lên cho các ký hiệu.
Đối với câu hỏi cụ thể của bạn "phụ thuộc vấn đề là gì?" nó dường như là một thời gian biên dịch trường hợp độ phân giải biểu tượng cạnh phức tạp, và các giải pháp được giới thiệu vào JLS2 là chỉ đơn giản là cấm chu kỳ được giới thiệu bởi các loại vòng loại cũng như siêu thực tế.
Nói cách khác, lý thuyết này có thể được thực hiện để làm việc với các cải tiến thích hợp cho trình biên dịch, nhưng cho đến khi ai đó đến và làm cho điều đó xảy ra thì thực tế hơn là chỉ cấm mối quan hệ bất thường này trong đặc tả ngôn ngữ.
@downvoter: Hãy giải thích lý do tại sao? – ruakh