2009-09-25 35 views

Trả lời

5

Generics Java được xử lý bởi trình biên dịch Java và được chuyển đổi thành phiên bản không chung chung tại thời gian biên dịch. Điều này khác với .NET nơi CLR có hỗ trợ lớp đầu tiên cho các tham số kiểu. Ở cấp độ bytecode, ArrayList<T> sẽ chỉ đơn giản là ArrayList.

Để báo Java docs:

Generics được thực hiện bởi trình biên dịch Java là một chuyển đổi front-end gọi tẩy xoá, mà là quá trình dịch hoặc viết lại mã có sử dụng Generics vào mã phi generic (tức là, ánh xạ cú pháp mới tới đặc tả JVM hiện tại). Nói cách khác, chuyển đổi này sẽ xóa tất cả thông tin loại chung; tất cả thông tin giữa các dấu ngoặc nhọn sẽ bị xóa. Ví dụ: LinkedList<Integer> sẽ trở thành LinkedList. Sử dụng các biến kiểu khác được thay thế bằng giới hạn trên của biến kiểu (ví dụ, Object), và khi mã kết quả không đúng, thì một phép chèn vào kiểu thích hợp được chèn vào.

+4

Tôi không thích Generics Java vì lý do này. Generics nên có được một tính năng chính, nhưng thay vào đó nó không nhiều hơn so với cú pháp đường để tránh đúc 'đối tượng' để một loại cụ thể. Đường là tuyệt vời, nhưng nó có thể đã được nhiều hơn nữa. Mumble các loại và do đó, thực sự làm tăng giá trị mặc dù, do đó, nó không phải tất cả xấu. – Joren

+1

@ Joren, bạn đang không cần thiết khắc nghiệt trên generics. Trong khi loại xóa là chắc chắn dissappointing, generics chắc chắn là một bước rõ ràng lên trên có để đúc từ Object như chúng tôi bây giờ có thể có tất cả các bảo đảm thời gian biên dịch của hệ thống loại Java với các lớp học genericized của chúng tôi. – Falaina

+3

Nhưng thông tin chung vẫn có sẵn trong tệp lớp được biên dịch dưới dạng siêu dữ liệu (nếu không 'javac' sẽ không thể kiểm tra Generics). Không thể IKVM sử dụng thông tin này? –

Các vấn đề liên quan