Ở mức bytecode, phương thức sẽ có bộ mô tả chỉ có một phương thức có tên getHashMap, không có đối số và trả về Bản đồ (không có generics).
Sau đó, khi trình biên dịch phân tích dòng Map<String, Map<Long, List<String>>> map = getHashMap();
, và nó sẽ nói, ok, tôi cần có một biến với kiểu khai báo là Map<String, Map<Long, List<String>>>
, nhưng để thực sự có được cá thể tôi cần gọi phương thức. Tại thời điểm này, công việc của trình biên dịch là kiểm tra xem kiểu trả về của phương thức có khớp với kiểu khai báo của biến mà bạn gán cho kết quả đó không. Vì vậy, nó sẽ kiểm tra nếu String
khớp với K
và nếu Map<Long, List<String>>
khớp với V, chúng sẽ làm như vậy, vì vậy nó xem xét việc gán là an toàn và tạo mã byte cơ bản sử dụng biến Bản đồ (không có generics).
Nếu bạn đã có thể tuyên bố phương pháp của bạn như:
static <K extends Number,V> Map<K,V> getHashMap()
{
return new HashMap<K, V>();
}
khi phân tích sự phân công, trình biên dịch sẽ thấy rằng String
không phù hợp K extends Number
, sẽ ném một lỗi biên dịch, và sẽ không tạo ra bytecode cho nhiệm vụ đó.
Nguồn
2010-09-21 14:31:50
Bạn có thể giải thích một chút không. – Emil
@Emil Về cái gì? –
@Tom: Ý bạn là javac sẽ suy ra loại. Bạn có thể giải thích cách hoạt động của nó trong các bước. – Emil