Tôi nghĩ rằng những câu trả lời khác đã nói điều này ở một mức độ nào đó, nhưng không rõ ràng lắm. Một trong những vấn đề với thuốc generic là mất các loại chung trong quá trình phản ánh. Ví dụ:
List<String> arr = new ArrayList<String>();
assertTrue( ArrayList.class, arr.getClass() );
TypeVarible[] types = arr.getClass().getTypedVariables();
Thật không may, các kiểu trả về không thể cho bạn biết rằng các kiểu chung của mảng là Chuỗi. Đó là một sự khác biệt tinh tế, nhưng nó quan trọng. Bởi vì mảng được tạo trong thời gian chạy, các kiểu chung bị xóa trong thời gian chạy, do đó bạn không thể tìm ra. Như một số tuyên bố ArrayList<Integer>
trông giống như ArrayList<String>
từ một quan điểm phản ánh.
Điều này có thể không quan trọng đối với người dùng Generics, nhưng giả sử chúng tôi muốn tạo ra một khung công tác ưa thích sử dụng sự phản chiếu để tìm ra những điều lạ mắt về cách người dùng khai báo các loại chung chung cụ thể.
Factory<MySpecialObject> factory = new Factory<MySpecialObject>();
MySpecialObject obj = factory.create();
Giả sử chúng tôi muốn một nhà máy chung tạo ra một thể hiện MySpecialObject
vì đó là loại chung chung cụ thể mà chúng tôi đã khai báo cho trường hợp này. Lớp Factory cũng không thể tự hỏi mình để tìm ra loại cụ thể được khai báo cho trường hợp này vì Java đã xóa chúng.
Trong tổng quát của .Net, bạn có thể thực hiện việc này vì trong thời gian chạy, đối tượng biết các kiểu chung vì trình biên dịch tuân thủ nhị phân. Với việc xóa Java không thể làm điều này.