Tôi gặp một số khó khăn 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, có một tham số danh sách tùy chọn:
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 đưa ra lỗi sau:
Person.java:9: The constructor Person(String, List<Object>) is undefined
Nhưng Collections.emptyList()
trả về loại <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());
}
sản lượng
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 đó, thay đổi sau đây sẽ khiến lỗi không còn nữa:
public Person(String name) {
this.name = name;
this.nicknames = Collections.emptyList();
}
Bất cứ ai cũng có thể giải thích quy tắc kiểm tra loại nào tôi đang chạy theo ở đây, và cách tốt nhất để làm việc xung quanh nó? 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 theo mẫu "tham số tùy chọn" này mà không cần sao chép mã.
Đối với tín dụng bổ sung: khi nào thì thích hợp để sử dụng EMPTY_LIST
trái ngược với emptyList()
?