Tôi gặp sự cố khi điều hướng quy tắc của Java để suy ra các tham số loại chung. Hãy xem xét các lớp sau đây, trong đó có một số danh sách tùy chọn:Collections.emptyList() trả về một Danh sách <Object>?
import java.util.Collections;
import java.util.List;
public class Person {
private String name;
private List<String> nicknames;
public Person(String name) {
this(name,Collections.emptyList());
}
public Person(String name,List<String> nicknames) {
this.name = name;
this.nicknames = nicknames;
}
}
trình biên dịch Java của tôi cung cấp cho các lỗi sau:
Person.java:9: The constructor Person(String, List<Object>) is undefined
Nhưng Collections.emptyList()
lợi nhuận gõ <T> List<T>
, không List<Object>
. Thêm một diễn viên không giúp
public Person(String name) {
this(name,(List<String>)Collections.emptyList());
}
mang
Person.java:9: inconvertible types
Sử dụng EMPTY_LIST
thay vì emptyList()
public Person(String name) {
this(name,Collections.EMPTY_LIST);
}
sản lượng
Person.java:9: warning: [unchecked] unchecked conversion
Trong khi mak thay đổi sau es lỗi sẽ biến mất:
public Person(String name) {
this.name = name;
this.nicknames = Collections.emptyList();
}
Bất cứ ai có thể giải thích quy tắc kiểm tra loại nào tôi đang gặp phải ở đây và cách tốt nhất để giải quyết? Trong ví dụ này, ví dụ mã cuối cùng là thỏa đáng, nhưng với các lớp lớn hơn, tôi muốn có thể viết các phương thức sau mẫu "tham số tùy chọn" này mà không cần sao chép mã.
Để nhận thêm tín dụng: khi nào thích hợp để sử dụng EMPTY_LIST
thay vì emptyList()
?
Đối với tất cả các câu hỏi liên quan đến Generics Java, tôi khuyên bạn nên "[Generics and Collections] Java (http://oreilly.com/catalog/9780596527754/)" của Maurice Naftalin, Philip Wadler. –