Như một ví dụ thực tế của các câu hỏi chung về lĩnh vực này, tôi muốn thực hiện phương pháp containsAll
trong giao diện Set
vớiGiao diện thực hiện với lập luận phương pháp superclasses
public boolean containsAll(Iterable<?> c) { /* ... */ }
tôi con số này nên được cho phép, kể từ Collection
là Iterable
nghĩa là containsAll
sẽ bao gồm yêu cầu giao diện. Tương tự như vậy, nói chung có thể thực hiện các giao diện với các siêu lớp đối số có vẻ như nó sẽ hoạt động.
Tuy nhiên, Eclipse không nói cách nào (chưa thử chỉ javac thẳng lên) - ai đó có thể giải thích lý do cho điều đó không? Tôi chắc chắn có một cái gì đó trong spec đó làm cho nó theo cách nó được, nhưng tôi muốn hiểu động lực cho yêu cầu là tốt. Hoặc tôi thiếu một cái gì đó như Iterable<?>
không phải là một siêu lớp của Collection<?>
?
Là câu hỏi phụ - tôi tuyên bố hai phương pháp sẽ là phương pháp có ký hiệu Iterable
luôn được ưu tiên cho các cuộc gọi với đối số Collection
?
Lỗi Eclipse:
Nếu tôi loại bỏ các phương pháp với chữ ký Collection
, chỉ cần rời khỏi Iterable
một (thấy sau khi lỗi), tôi nhận được như sau:
The type BitPowerSet must implement the inherited abstract method Set<Long>.containsAll(Collection<?>)
Việc thực hiện chính xác con người :
@Override public boolean containsAll(Collection<?> c) {
for (Object o : c) if (!contains(o)) return false;
return true;
}
public boolean containsAll(Iterable<?> c) {
for (Object o : c) if (!contains(o)) return false;
return true;
}
Bạn có thể đăng lỗi mà Eclipse đang cung cấp cho bạn không? Làm việc cho tôi trong IDEA. –
@Nikita: đã được chỉnh sửa. Soooo ... nó có thể chỉ là một điều Eclipse? – Carl
Đây là một cơn ác mộng về thuật ngữ. Tôi chạy trốn khỏi những thử thách như vậy. – skaffman