Trong đó có một vấn đề nội bộ tại sao các lớp ẩn danh java không thể thực hiện và phân lớp cùng một lúc? Hay chỉ vì cú pháp?Tại sao một lớp ẩn danh không thể thực hiện nhiều giao diện trực tiếp? Đơn giản chỉ vì cú pháp hoặc có lý do khác?
Trả lời
cú pháp duy nhất, vì vậy được gọi là các lớp ẩn danh là các lớp bình thường 100%. bạn có thể có thể đạt được một kết quả sôi nổi bằng cách sử dụng java.lang.reflect.Proxy và InvocationHandler, sẽ là cách bẩn thỉu nhất để làm điều đó.
cách đơn giản bao gồm tuyên bố lớp trong phương pháp này và chỉ cần thêm 'cụ',
lớpAnonymous được cung cấp như là một cách nhanh chóng và ngắn gọn xây dựng một lớp "một off". Câu hỏi của bạn cho thấy rằng bạn đang cố gắng sử dụng lớp anon của bạn theo nhiều cách (ít nhất một giao diện và một giao diện mở rộng). Trong trường hợp này, nó sẽ dễ đọc hơn và dễ bảo trì hơn nếu bạn quảng cáo lớp anon đó với một lớp học đầy đủ.
Điều này cũng sẽ ngăn chặn các tác dụng phụ không mong muốn bằng cách quản lý tốt hơn gói đóng gói của các lớp học của bạn.
Tìm thấy một hack xung quanh này
tạo một giao diện ở dưới cùng của tập tin phù thủy của bạn mở rộng tất cả các giao diện mà bạn muốn thực hiện sau đó tạo ra một lớp vô danh trong đó thực hiện điều này.
Trong đó có vấn đề nội bộ tại sao các lớp ẩn danh java không thể triển khai và phân lớp cùng một lúc?
Tôi tin rằng đó là 99% do lý do cú pháp. Loại tham số thậm chí hỗ trợ intersection types (<T extends InterfaceX & InterfaceY>
) vì vậy tôi không nghĩ rằng bất kỳ "mâu thuẫn" hoặc thậm chí biến chứng sẽ phát sinh trong hệ thống kiểu nếu hỗ trợ cho tính năng đó sẽ được thêm vào.
Một biểu hiện như new (InterfaceX & InterfaceY)() { ... }
rất tốt có thể được biên dịch vào một cái gì đó giống như
interface InterfaceXandY extends InterfaceX, InterfaceY {}
... new InterfaceXandY() { ... }
Lý do không có sự hỗ trợ cho nó rất có thể là do thực tế rằng đó là một trường hợp sử dụng rất hiếm khi mà có một giải pháp đơn giản.
Trên ghi chú có liên quan một phần. Bạn thể cho một lambda thực hiện ví dụ Serializable
bằng cách làm
Runnable r = (Runnable & Serializable)() -> System.out.println("Serializable!");
Câu trả lời hay nhất +1. Hoàn toàn đồng ý rằng nếu có một công việc rất tầm thường xung quanh, tại sao thực hiện một thay đổi cơ bản trong ngôn ngữ và giới thiệu một cú pháp cồng kềnh của hai loại tĩnh. –
đóng cửa bị gạt ra khỏi Java ban đầu hơn vì thời gian áp lực hơn bất cứ điều gì khác . Trong những ngày đầu của Java, việc thiếu các đóng cửa khá đau đớn và do đó các lớp bên trong được sinh ra: một sự thỏa hiệp không thoải mái khi cố gắng tránh một số vấn đề khó khăn . Nhưng như là bình thường trong rất nhiều vấn đề thiết kế, các đơn giản hóa đã không thực sự giải quyết bất kỳ vấn đề, họ chỉ cần di chuyển chúng.
Thú vị, bây giờ biểu thức lambda và đóng được thêm vào Java, và lần này được thiết kế với một cái gì đó khác với lớp bên trong, chúng tôi có thể xác định một đối tượng trên bay được tạo bởi nhiều giao diện. một là giao diện điểm đánh dấu.
interface Bar {
default String getName() { return "Bar"; }
}
Object o = (Comparable<Integer> & Bar) (x,y) -> x > y ? x : y;
Bar b = (Bar) o;
System.out.println(b.getName()); //Bar
Điều này biên dịch và chạy hoàn hảo trong bản xây dựng mới nhất của JDK 8 (ngày 12 tháng 3 năm 2013). Vì vậy, có vẻ như họ đã suy nghĩ nhiều hơn về vấn đề này.
- 1. Thực hiện hai giao diện trong một lớp vô danh
- 2. Tại sao chúng ta không thể khởi tạo một giao diện hoặc một lớp trừu tượng trong java mà không có một phương thức lớp ẩn danh?
- 3. Một phương pháp tạo giao diện trò chơi đơn giản
- 4. Phương thức giao diện Java Phương pháp: Mỗi lớp có thực hiện một giao diện không?
- 5. Có thể buộc thực hiện rõ ràng giao diện (hoặc một phần của giao diện) không?
- 6. Tại sao không có StringBuilder và StringBuffer thực hiện một giao diện chung?
- 7. clojure yêu cầu lý do cú pháp
- 8. Tại sao một lớp trừu tượng thực hiện một giao diện có thể bỏ lỡ việc khai báo/thực hiện một trong các phương thức của giao diện?
- 9. Thực hiện một bảng địa chỉ trực tiếp
- 10. không thể cast để giao diện thực hiện
- 11. lý do tại sao: khác không (khác) trong clojure?
- 12. Tại sao tạo serialVersionUID dài thay vì 1L đơn giản?
- 13. Tại sao chọn JMS cho giải pháp không đồng bộ? Tại sao nó tốt hơn đậu thực thể đơn giản?
- 14. Xác định xem một lớp có thực hiện một giao diện rất cụ thể hay không
- 15. Tại sao ứng dụng giao diện điều khiển .NET đơn giản này lại có quá nhiều luồng?
- 16. Lý do không sử dụng lớp trừu tượng thay vì giao diện?
- 17. Tại sao luôn có giao diện implementaion đơn trong các lớp dịch vụ và dao?
- 18. lý do tại sao math.Ceiling (double a) không trả về int trực tiếp?
- 19. lý do tại sao chúng ta cần giao diện thay vì lớp và những gì chúng ta đang đạt được từ giao diện
- 20. Tại sao giao diện không thể triển khai giao diện khác?
- 21. Khi một lớp thực hiện giao diện con cháu, tại sao nó không tự động được tính là thực hiện giao diện cơ sở?
- 22. Một hạt EJB có thể thực hiện nhiều giao diện không?
- 23. Tại sao một Enum thực hiện Giao diện?
- 24. Tại sao Clojure có 5 cách để xác định một lớp thay vì chỉ một?
- 25. Có một cú pháp để tạo một lớp con ẩn danh trong C# không?
- 26. lý do tại sao không có phương thức thêm trong giao diện Iterator
- 27. Có đang sử dụng giao diện một-một với thực thể miền hay không? Tại sao?
- 28. Tạo và lớp DAO (giao diện + implentation) hoặc implentation chỉ
- 29. phương pháp Tại sao giao diện không thể có được bảo vệ
- 30. Tại sao giao diện chỉ có thể được khai báo trong lớp cấp cao nhất?
Tôi không biết rằng tôi sẽ gọi đây là hack – Michael