Làm thế nào Java có thể được cải thiện để nó không còn cần phải thực hiện xóa kiểu?


16

Các Java hướng dẫn chính thức về Generics giải thích loại tẩy xoá và tại sao nó đã được thêm vào trình biên dịch:

Khi một kiểu chung được khởi tạo, trình biên dịch sẽ dịch các kiểu đó bằng một kỹ thuật gọi là xóa kiểu - một quá trình trong đó trình biên dịch loại bỏ tất cả thông tin liên quan đến các tham số kiểu và các đối số kiểu trong một lớp hoặc phương thức. Kiểu xóa cho phép các ứng dụng Java sử dụng tổng quát để duy trì khả năng tương thích nhị phân với các thư viện và ứng dụng Java đã được tạo trước khi tạo chung.

Đây rất có thể là một cách tiếp cận thực tế, hoặc có lẽ là cách ít đau đớn nhất. Tuy nhiên, hiện nay thuốc generic được hỗ trợ rộng rãi trong toàn ngành, chúng ta có thể làm gì để không cần phải xóa kiểu? Là nó khả thi với việc cần phải phá vỡ tính tương thích ngược, hoặc nếu nó khả thi, nó có thực tế không?

Có tuyên bố cuối cùng trong trích dẫn ở trên đã trở thành tự tham khảo? Đó là: "loại xóa cho phép các ứng dụng Java sử dụng tổng quát để duy trì khả năng tương thích nhị phân với các thư viện và ứng dụng Java được tạo bằng các phiên bản Java thực hiện xóa kiểu."


1
Mặt trời 1.4 đã bị EOL'ed. IBM vẫn hỗ trợ 1.4 trên nền tảng của họ.

@ ThorbjørnRavnAndersen: Và ít nhất là đối với nền tảng nằm dưới tầng hầm của cha tôi, không có 1,5.
Jörg W Mittag

@ ThorbjørnRavnAndersen Không chỉ vậy mà người ta còn có thể mua hỗ trợ mở rộng cho các phiên bản trước đó của JVM. Lần cuối tôi nghe mặc dù nó khá đắt.
maple_shaft

1
Không ai trong chúng ta ở đây sở hữu một quả cầu pha lê, do đó, nó không thể trả lời được. Có lẽ nó có thể được mở lại nếu bạn đặt lại câu hỏi từ câu hỏi "Sẽ có ..." thành câu hỏi "Cần phải hoàn thành điều gì để Loại bỏ được thực hiện trong phiên bản tương lai của Java"
maple_shaft

@ JörgWMittag đó có phải là một nền tảng thực sự được sử dụng để sản xuất vào năm 2012 không?

Câu trả lời:


7

Thời hạn sử dụng áp dụng cho Bộ công cụ phát triển Java và Môi trường chạy thi hành Java. Và chỉ có các phiên bản Oracle (Sun). Nhưng nó không áp dụng cho các ứng dụng được viết bởi bên thứ ba. Mục đích là không bao giờ phá vỡ mã đã từng chạy trên JVM, do đó, Java sẽ không bao giờ ngừng thực hiện việc xóa kiểu.

Tất nhiên, C # cũng đã giới thiệu thuốc generic trong phiên bản sau theo cách tương thích ngược mà không thực hiện xóa kiểu, nhưng về cơ bản nó có nghĩa là sao chép tất cả các lớp bộ sưu tập. Mà tôi cho rằng đó là những gì các nhà thiết kế Java không muốn làm và do đó tại sao họ lại chọn loại tẩy xóa ngay từ đầu. Không có loại giá trị, lợi thế của thuốc generic không xóa là không lớn.


6
Nhóm OpenJDK đã thảo luận về việc xem lại Generics thống nhất, khung thời gian? Nhiều khả năng sẽ được xem xét nghiêm túc trong khung thời gian của Java 9 và nếu nó khả thi về mặt kỹ thuật, được phân phối trong khung thời gian của Java 10. Nhưng đây là một vấn đề nghiêm trọng.
Martijn Verburg

Kiểu xóa được thực hiện bởi trình biên dịch, không phải JVM. Giới thiệu các tổng quát thống nhất sẽ yêu cầu một trình biên dịch mới và JVM mới, nhưng có lẽ chúng vẫn sẽ hoạt động với mã cũ.
Gabe

@Gabe: Rõ ràng là chúng sẽ được giới thiệu trong bản phát hành mới, vì vậy sẽ có trình biên dịch mới và JVM mới. Nhưng nó cũng yêu cầu sao chép một phần đáng kể của thư viện tiêu chuẩn, bởi vì nó sẽ cần các phiên bản chung cho mã mới và các phiên bản không chung chung để tương thích ngược. .NET đã làm điều đó trong phiên bản 2.0, Java đã tránh nó bằng cách xóa. .NET có các loại giá trị (struct) và hỗ trợ hạng nhất cho chúng loại trừ việc xóa kiểu. Java thì không, vì vậy áp lực cho các thế hệ thống nhất nhỏ hơn nhiều.
Jan Hudec

Jan: Tôi chỉ bình luận về thực tế rằng việc tổng hợp lại không tự động có nghĩa là tất cả các mã cũ đã bị hỏng. Tôi cũng sẽ nói thêm rằng List<int>có lẽ sẽ làm cho khối lượng công việc chắc chắn hiệu quả hơn nhiều so với hiện tại List<Integer>.
Gabe

@Gabe: Chúng tôi không đồng ý về điều đó. Tôi chỉ muốn lưu ý nhược điểm chính.
Jan Hudec
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.