Sự hiểu biết của tôi là lý do tại sao có các loại thô và loại tẩy xoá trong Java là vì tại thời điểm generics được giới thiệu, có các API chuẩn không thể được tạo chung mà không vi phạm mã hiện có.Tại sao Java (nhưng không .NET) không thể chứa các generics mà không cần loại thô/loại xóa?
Generics cũng được giới thiệu với .NET tại một số điểm trên đường, nhưng tính năng này đã được triển khai theo cách không phụ thuộc vào loại thô hoặc loại xóa (và nếu có, nó theo cách đó minh bạch cho người dùng). Vì vậy, các API hiện tại vẫn không thay đổi (ví dụ, mã trong không gian tên System.Collections) và các API chung mới được giới thiệu (ví dụ, mã trong không gian tên System.Collections.Generic).
Vì vậy, làm thế nào đến Generics Java, không giống như Generics NET., Yêu cầu loại thô/loại tẩy xoá?
Ngoài ra, .Net đã thay thế các vùng chứa hiện tại bằng các phiên bản chung trong một không gian tên khác. Mã mà muốn sử dụng chúng phải được chuyển khá nhiều cùng một lúc. Cách của Java cho phép họ chỉ đơn giản là làm cho các thùng chứa hiện có chung chung, do đó, chuyển từng bit một có nghĩa là chỉ thỉnh thoảng bỏ qua và bỏ qua cảnh báo. –
@SebastianRedl: Về cơ bản, phần mở rộng của generics là một tính năng biên dịch-chỉ-thời gian. – SLaks
Mặc dù .NET đã thay đổi ngôn ngữ bytecode, tôi không nghĩ Java sẽ nhất thiết phải làm như vậy để cho phép các đối tượng chung biết loại của chúng. Tôi sẽ nghĩ rằng mọi trường hợp đối tượng chung có thể chứa một hoặc nhiều trường được tạo bởi trình biên dịch biểu thị sự kết hợp của các kiểu đã được tạo ra và cho trình biên dịch tạo mã để xác nhận các trường đó khi thích hợp. Tôi nghĩ rằng một vấn đề lớn hơn sẽ xảy ra nếu một 'ArrayList' được triển khai thành bất kỳ loại nào khác ngoài 'ArrayList' ... –
supercat