Vì vậy, tôi có một lớp với một constructor như thế này:Tại sao sử dụng Collections.emptySet() với generics làm việc trong nhiệm vụ nhưng không phải là tham số phương thức?
public FilterList(Set<Integer> labels) {
...
}
và tôi muốn xây dựng một đối tượng mới FilterList
với một tập rỗng. Theo lời khuyên của Joshua Bloch trong cuốn sách Effective Java, tôi không muốn tạo một đối tượng mới cho bộ trống; Tôi sẽ chỉ cần sử dụng Collections.emptySet()
thay vì:
FilterList emptyList = new FilterList(Collections.emptySet());
này mang lại cho tôi một lỗi, phàn nàn rằng java.util.Set<java.lang.Object>
không phải là một java.util.Set<java.lang.Integer>
. OK, làm thế nào về điều này:
FilterList emptyList = new FilterList((Set<Integer>)Collections.emptySet());
Điều này cũng cho tôi một lỗi! Ok, làm thế nào về điều này:
Set<Integer> empty = Collections.emptySet();
FilterList emptyList = new FilterList(empty);
Hey, nó hoạt động! Nhưng tại sao? Sau khi tất cả, Java không có suy luận kiểu, đó là lý do tại sao bạn nhận được một cảnh báo chuyển đổi không được kiểm soát nếu bạn làm Set<Integer> foo = new TreeSet()
thay vì Set<Integer> foo = new TreeSet<Integer>()
. Nhưng Set<Integer> empty = Collections.emptySet();
hoạt động mà không cần cảnh báo. Tại sao vậy?
tất cả các câu trả lời dưới đây là chính xác, nhưng những gì tôi không nhận được là: tại sao bạn khởi tạo bộ sưu tập của bạn với một emptyList thay vì gọi một hàm tạo mặc định không có tham số? Mỗi bộ sưu tập mà tôi biết đều có một hàm tạo với một bộ sưu tập hiện có và một hàm tạo rỗng. –
Điều thú vị là DOES biên dịch sau: 'FilterList emptyList = new FilterList ((Set) (Set Extends Object>) Collections.emptySet());' –
EricS
Một ví dụ khá thú vị: 'Set emptySet = (Set ) Collections.emptySet(); 'không biên dịch. –
neo