2009-05-28 18 views
8

Khi tôi hiểu chúng, Generics là một tính năng thời gian biên dịch của Java, và thông tin kiểu parametrized không tồn tại trong mã byte biên dịch. Bây giờ tôi đã phát hiện ra phương thứC# getGenericType và Method # getGenericReturnType, do đó làm tan vỡ tầm nhìn thế giới của tôi. Xin hãy giúp tôi ghép lại với nhau.loại java xóa với Field # getGenericType và Method # getGenericReturnType

Trả lời

3

Khi bạn đang xử lý một lọ mã bytecode được biên dịch trong IDE của mình, bạn vẫn có thể tự động hoàn thành chung. Đây là cách nó được thực hiện. Về cơ bản bạn nói đúng: loại không hoàn toàn bị xóa.

6

Các loại đối tượng thời gian chạy chỉ được xóa. Ví dụ:

Object obj = new ArrayList<String>(); 

obj.getClass() sẽ trở lại ArrayList.class. Bạn thậm chí có thể nói rằng ArrayList có thông số chung. Nhưng không có cách nào để biết liệu obj đã được tạo là ArrayList<String>, ArrayList<Integer>, ArrayList<Object>, ArrayList (nguyên) hay bất kỳ thứ gì khác.

Thông tin kiểu tĩnh vẫn còn cho lớp, phương pháp, v.v. (mặc dù không dành cho người dân địa phương). Đây chỉ là một chút dữ liệu được thêm vào dưới dạng các thuộc tính trong tệp lớp và có sẵn khi chạy. Hãy nghĩ về nó giống như chú thích với lưu giữ thời gian chạy. Có một câu hỏi?

2

Thông tin kiểu chung chung cho trường và phương thức phải có trong tệp lớp đã biên dịch, để khi bạn biên dịch mã nguồn khác, trình biên dịch có thể thực hiện kiểm tra kiểu. Ví dụ: khi bạn viết mã sử dụng biến loại ArrayList<E> và gọi phương thức get() trên đó, bạn không có mã nguồn cho lớp ArrayList. Trình biên dịch đi và xem xét tệp lớp đã biên dịch và nhận kiểu trả về chung của phương thức get() và nhận ra rằng nó trả về kiểu generic E, để nó có thể kiểm tra kiểu. Vì vậy, thông tin kiểu chung phải có mặt để trình biên dịch có thể kiểm tra nó.

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