Sự khác nhau giữa là gì List
, List<?>
, List<T>
, List<E>
, và List<Object>
?
1. Danh sách
List
: là một loại nguyên, do đó không typesafe
. Nó sẽ chỉ tạo ra một lỗi thời gian chạy khi truyền là xấu. Chúng tôi muốn một lỗi thời gian biên dịch khi dàn diễn viên tệ. Không nên sử dụng.
2. Danh sách <?>
List<?>
là một ký tự đại diện không giới hạn. Nhưng tôi không chắc nó để làm gì? Tôi có thể in List<?>
mà không có vấn đề:
public static void test(List<?> list){
System.out.println(list); // Works
}
Tại sao tôi không thể thêm các mục vào a List<?>
?
public static void test(List<?> list){
list.add(new Long(2)); // Error
list.add("2"); // Error
System.out.println(list);
}
3. Danh sách <T>
public static void test(List<T> list){ // T cannot be resolved
System.out.println(list);
}
Tôi không hiểu cú pháp này. Tôi đã thấy một cái gì đó như thế này, và nó hoạt động:
public <T> T[] toArray(T[] a){
return a;
}
Đôi khi, tôi thấy <T>
, hay <E>
, hoặc <U>
, <T,E>
. Tất cả đều giống nhau hay chúng đại diện cho một cái gì đó khác nhau?
4. Danh sách <Đối tượng>
Điều này đưa ra lỗi "Phương thức test(List<Object>)
không áp dụng cho đối số List<String>
":
public static void test(List<Object> list){
System.out.println(list);
}
Nếu tôi thử điều này thì tôi nhận được "Không thể truyền từ List<String>
đến List<Object>
":
test((List<Object>) names);
Tôi bị bối rối. String
là một lớp con của Object
, vậy tại sao không phải List<String>
là một lớp con của List<Object>
?
2
. Tôi viết một số mã để chứng minh điều này2
. tyvm