Vấn đề với
List<String> list = new LinkedList();
là ở phía bên tay trái, bạn đang sử dụng chung loại List<String>
nơi ở phía bên phải bạn đang sử dụng các nguyên liệu loại LinkedList
. Các kiểu thô trong Java thực sự chỉ tồn tại để tương thích với mã tiền chung và không bao giờ được sử dụng trong mã mới trừ khi bạn thực sự phải làm vậy.
Bây giờ, nếu Java có các tổng quát ngay từ đầu và không có các kiểu, chẳng hạn như LinkedList
được tạo ra trước khi có các tổng quát, thì có lẽ nó đã tạo ra nó để hàm tạo cho một kiểu chung tự động truyền các tham số kiểu của nó từ bên trái bên tay của nhiệm vụ nếu có thể. Nhưng nó đã không, và nó phải xử lý các loại thô và loại chung khác nhau để tương thích ngược. Điều đó khiến họ cần phải thực hiện một cách khác để khai báo một thể hiện mới của một đối tượng chung mà không phải lặp lại các tham số loại của nó ... toán tử kim cương.
Theo như ví dụ ban đầu của bạn List<String> list = new LinkedList()
, trình biên dịch tạo cảnh báo cho phép gán đó bởi vì nó phải. Xem xét điều này:
List<String> strings = ... // some list that contains some strings
// Totally legal since you used the raw type and lost all type checking!
List<Integer> integers = new LinkedList(strings);
Generics tồn tại để cung cấp bảo vệ thời gian biên dịch chống lại việc làm sai. Trong ví dụ trên, sử dụng loại thô có nghĩa là bạn không nhận được sự bảo vệ này và sẽ gặp lỗi khi chạy. Đây là lý do tại sao bạn không nên sử dụng các loại thô.
// Not legal since the right side is actually generic!
List<Integer> integers = new LinkedList<>(strings);
Tuy nhiên, toán tử kim cương cho phép phía bên phải của phép gán được xác định là một thể hiện chung thực sự với các tham số cùng loại với bên trái ... mà không phải nhập lại các tham số đó. Nó cho phép bạn giữ sự an toàn của thuốc generic với nỗ lực gần như tương tự như sử dụng loại thô.
Tôi nghĩ điều quan trọng cần hiểu là các loại thô (không có <>
) không thể được đối xử giống như các loại chung. Khi bạn khai báo một loại thô, bạn sẽ không nhận được bất kỳ lợi ích và kiểm tra loại tổng quát nào. Bạn cũng phải nhớ rằng thuốc generic là một phần mục đích chung của ngôn ngữ Java ... chúng không chỉ áp dụng cho các nhà xây dựng không tranh cãi của Collection
s!