2008-12-17 8 views

Trả lời

9

Để cho phép tương thích nhị phân với bytecode trước Generics, do đó cho phép mã mới giao tiếp với mã cũ.

Từ Type Erasure trang của Java Hướng dẫn:

Loại tẩy xoá phép các ứng dụng Java sử dụng Generics để duy trì nhị phân khả năng tương thích với các thư viện Java và ứng dụng được tạo ra trước generics.

[...]

Loại tẩy xoá tồn tại do đó mã mới có thể tiếp tục giao tiếp với di sản mã.

Để biết câu hỏi liên quan, hãy xem C# vs Java generics.

4

Tôi nhớ đọc một cái gì đó về điều này trong cuốn sách Hardcore Java:

Vấn đề với việc kiểm tra các yếu tố trong một bộ sưu tập trong thời gian chạy là nó là cực kỳ tốn kém; thứ tự của hiệu suất chỉ là O (n). Nếu bạn chỉ có chỉ 10 địa chỉ trong bộ sưu tập của mình, thì hãy dễ dàng xem các yếu tố kiểm tra . Tuy nhiên, nếu bộ sưu tập chứa 15.000 địa chỉ, thì bạn sẽ phải chịu một khoản phí quan trọng là bất cứ khi nào ai đó gọi cho người đặt cược.

Mặt khác, nếu bạn có thể ngăn chặn người dùng đặt bất cứ điều gì khác hơn là một địa chỉ trong bộ sưu tập của bạn tại thời gian biên dịch, sau đó bạn sẽ không phải kiểm tra các loại tại runtime. Nếu họ cố gắng cung cấp cho bạn nội dung nào đó không phải là địa chỉ, thì trình biên dịch sẽ từ chối nỗ lực đó. Đây chính xác là những gì được tham số loại làm.

Tuy nhiên, câu hỏi "tại sao" không bao giờ thực sự được trả lời thỏa đáng vì chỉ có quá nhiều biến liên quan đến con người, thời gian, địa điểm và chính trị. Tôi nhớ đọc ở đâu đó khác rằng quyết định có liên quan nhiều đến việc duy trì tính tương thích với cách mọi thứ đã được thực hiện trong mã byte Java. Đây là một trích dẫn khác từ cùng một cuốn sách:

Sau khi trình biên dịch đã giải quyết sự an toàn loại được giới thiệu bởi generics, nó sẽ xóa tham số từ loại. Do đó, thông tin không có sẵn khi chạy. Mục đích của việc xóa, theo như Sun tuyên bố, là cho phép các thư viện lớp được xây dựng với phiên bản JDK cũ hơn để có thể chạy trên máy ảo JDK 1.5.

Tôi tò mò, những ưu điểm được cung cấp bởi generics thời gian chạy là gì?