Tôi đang cố gắng viết một thư viện các giao diện bộ sưu tập thực hiện hầu hết các phương thức trong API thu thập tiêu chuẩn bằng cú pháp phương pháp mặc định mới trong Java 8. Đây là một ví dụ nhỏ về tôi sẽ cho:Lỗi Java 8: Giao diện thừa kế trừu tượng và mặc định
public interface MyCollection<E> extends Collection<E> {
@Override default boolean isEmpty() {
return !iterator().hasNext();
}
//provide more default overrides below...
}
public interface MyList<E> extends MyCollection<E>, List<E> {
@Override default Iterator<E>iterator(){
return listIterator();
}
//provide more list-specific default overrides below...
}
Tuy nhiên, ngay cả ví dụ đơn giản này được đáp ứng với một lỗi biên dịch:
error: interface MyList<E> inherits abstract and default
for isEmpty() from types MyCollection and List
Từ sự hiểu biết của tôi về phương pháp mặc định, điều này sẽ được phép vì chỉ có một trong những mở rộng giao diện cung cấp triển khai mặc định, nhưng ap không phải vậy. Những gì đang xảy ra ở đây? Có cách nào để có được điều này để làm những gì tôi muốn?
Sự cần thiết phải sao chép tất cả các chữ ký phương pháp này là đáng thất vọng, nhưng điều này có vẻ giống như chính xác những gì tôi đang tìm kiếm. Được chấp nhận, giả sử không có cách nào để tránh điều này. –
Điều thực sự xấu về nó là không có lý do cho 'List' để redeclare' isEmpty() '. Mục đích duy nhất có vẻ là thay đổi nhận xét tài liệu từ thừa kế "Trả về true nếu bộ sưu tập này không chứa các phần tử". Cụ thể hơn "Trả về true nếu danh sách này không chứa các phần tử." Không có điều này, mọi thứ sẽ hoạt động như trước nhưng biên dịch lỗi từ câu hỏi này sẽ được đi như 'MyCollection.isEmpty()' ghi đè 'Collection.isEmpty()' ... – Holger
@ Holger Bạn đang phải trong trường hợp này. Nhưng đối với các phương thức khác như 'toArray', tài liệu khác nhiều hơn về hợp đồng phương thức. Tôi nghĩ rằng vấn đề này đến như là một mức giá để sử dụng các phương pháp mặc định. – manouti