Bạn chắc chắn nên đọc hướng dẫn này trên Java Generics: http://docs.oracle.com/javase/tutorial/java/generics/
Tóm lại:
Nhiều lớp Java và các loại (được gọi là các lớp chung chung hoặc loại chung), thường là các bộ sưu tập, được gọi là nhập e thông số, chẳng hạn như E
trong ArrayList<E>
(E
chỉ là một cái tên được lựa chọn tùy ý, các lớp học khác tên nó như T
hoặc bất kỳ):
public class ArrayList<E> extends ... {
public E get(int index) { ... }
public boolean add(E element) { ... }
// other methods...
}
Bây giờ, khi bạn tạo một thể hiện của lớp như thế, bạn định nghĩa một bê tông giá trị của tham số kiểu, ví dụ String
(E
thường có thể được đánh giá để bất cứ loại bạn muốn):
ArrayList<String> stringList = new ArrayList<String>();
Từ giờ trở đi, tất cả các E
s được "thay thế" bởi String
cho stringList
biến, vì vậy bạn có thể thêm chỉ Strings vào nó và nhận được chỉ Strings từ nó. Kiểm tra trình biên dịch cho bạn rằng bạn không nhầm lẫn thêm một đối tượng kiểu khác:
stringList.add(Integer.valueOf(1));
// compile error - cannot add Integer to ArrayList of Strings
Tuy nhiên, do Generics đã được thêm vào Java 5, nó vẫn còn có thể viết mã mà không có họ để tương thích ngược . Vì vậy, bạn có thể viết:
ArrayList list = new ArrayList();
Nhưng bạn mất tất cả các lợi ích kiểm tra loại. E
s trong các chữ ký phương thức trở thành chỉ đơn giản là Object
s.
list.add(Integer.valueOf(42)); // adding an Integer
list.add("aaa"); // adding a String
Object something = list.get(0); // unknown type of returned object, need to cast
Integer i0 = (Integer) something; // this unsafe cast works...
Integer i1 = (Integer) list.get(1); // but this fails with a ClassCastException
// because you cannot cast a String to Integer
Thực tế là sử dụng một liệu loại (có nghĩa là một kiểu generic với tham số kiểu của nó bỏ qua) là không an toàn, là lý do cho những cảnh báo bạn đã có. Thay vì chỉ ArrayList
, hãy sử dụng ArrayList<String>
hoặc ArrayList<Integer>
hoặc bất kỳ loại nào của số items
của bạn.
Wow nhờ điều này! Giải thích rất rõ ràng @Natix. +1 – KarenAnne
Có thể bạn đưa ra giải pháp chính xác cho câu hỏi được hỏi? – Satish