Vâng, động lực (tương thích ngược) là cả một lợi thế và bất lợi. Đó là bất lợi bởi vì tất cả chúng ta muốn có các loại có thể xác nhận lại, nhưng giá phải trả là cao. Hãy xem xét các lựa chọn thiết kế trong C #. Chúng có các loại có thể xác nhận lại, nhưng bây giờ chúng có các API trùng lặp. Vì vậy, hãy tưởng tượng một API Java nơi chúng tôi cũng có các API trùng lặp cho mỗi lớp được tham số hóa. Bây giờ, hãy hình dung bản thân bạn chuyển hàng ngàn dòng mã từ các lớp kế thừa sang các lớp chung mới. Bây giờ, ai sẽ không coi các API trùng lặp là một bất lợi? Nhưng này, họ có loại đáng tin cậy!
Vì vậy, động lực chính là "tiến hóa, không phải cách mạng". Và theo logic, mọi quyết định đều có sự đánh đổi.
Bên cạnh những nhược điểm khác được đề cập, chúng ta cũng có thể thêm một thực tế là việc xóa kiểu có thể khó giải thích về thời gian biên dịch, vì không rõ ràng rằng một số loại sẽ bị xóa và điều này dẫn đến những lỗi rất kỳ lạ và khó tìm.
Sự tồn tại của các phương thức cầu nối (trình biên dịch này được tạo ra theo phương pháp cú pháp để giữ tính tương thích nhị phân) cũng có thể được coi là bất lợi. Và đây có thể chính xác là một trong những lý do của lỗi tôi đã đề cập trong đoạn trước.
Những bất lợi lớn xuất phát từ thực tế đã rõ ràng là có một lớp duy nhất và không có nhiều lớp cho các loại chung. Như một ví dụ khác xem xét rằng quá tải một phương thức có cùng lớp chung không thành công trong Java:
public void doSomething(List<One>);
public void doSomething(List<Two>);
Một cái gì đó có thể được coi là một bất lợi của các loại có thể xác nhận lại (ít nhất là trong C #) là thực tế rằng chúng gây ra vụ nổ mã . Ví dụ List<int>là một lớp và một lớp List<double>khác hoàn toàn khác, vì nó là a List<string>và a List<MyType>. Vì vậy, các lớp phải được xác định trong thời gian chạy, gây ra sự bùng nổ của các lớp và tiêu thụ tài nguyên có giá trị trong khi chúng đang được tạo.
Về thực tế là không thể định nghĩa một new T()trong Java, được đề cập trong một câu trả lời khác, cũng rất thú vị khi xem xét rằng đây không chỉ là vấn đề xóa kiểu. Nó cũng yêu cầu sự tồn tại của một hàm tạo mặc định, đó là lý do tại sao C # yêu cầu "ràng buộc mới" cho việc này. (Xem Tại sao T () mới không thể có trong Java , bởi Alex Buckley).
T, bạn chỉ nhận được một bản sao củaClass<T>mã cho tất cả cácTs; cộng với một bản sao bổ sung cho từng loại giá trịTthực sự được sử dụng.