2013-06-18 36 views
7

Tôi đang cố gắng xây dựng một lớp thực hiện QueueMap. Cả hai giao diện xác định các phương pháp remove(Object), nhưng với kiểu trả về khác nhau:Triển khai giao diện không tương thích

public interface Collection<E> { //Queue extends Collection, which has the problem method 

    public boolean remove(Object e); 

    //... 
} 

public interface Map<K,V> { 

    public V remove(K key); 

    //... 
} 

public class QueuedMap<K,V> extends AbstractMap implements Queue { 

    public V remove(K key) {/* ... */} 
    //ERROR: V is not compatible with boolean 

    //... 
} 

Các loại tẩy xoá của K đang gây ra những hai chữ ký phương pháp để va chạm. Tôi không thể có một trong số chúng vì đó là ghi đè không hợp lệ và tôi không thể có cả hai vì chúng có cùng chữ ký. Có cách nào mà tôi có thể làm cho hai giao diện này cùng tồn tại?

+0

khỏi vòng đeo tay, điều này dường như không thể đối với tôi. –

+0

Lớp học của bạn sẽ quyết định cái nào nên sử dụng, nếu bạn gọi loại bỏ (khóa)? –

+0

[Không nhìn tốt] (http://stackoverflow.com/questions/573621/is-the-c-sharp-explicit-implementation-of-the-interface-present-in-java) –

Trả lời

4

Tôi không tin điều đó có thể xảy ra trong trường hợp cụ thể này. Nếu cả hai lớp trả về các kiểu Object bạn muốn có một số cơ hội, nhưng vì bạn đang trộn các kiểu cơ bản và kiểu đối tượng, không có kiểu tương thích nào hỗ trợ cả hai giao diện.

Cách tiếp cận khác có thể là triển khai các giao diện thích hợp tương thích, sau đó sử dụng bố cục để lưu trữ cấu trúc nội bộ và chức năng ánh xạ cuộc gọi đến khi cần. Điều đó sẽ giả định rằng bạn không cần phải thỏa mãn hoặc có thể sử dụng được như cả hai giao diện, mà đúng hơn là một giao diện cụ thể là cái bạn cần để lộ ra.

Tuy nhiên, nếu bạn cần làm cho lớp này có thể thay thế thành hai giao diện không tương thích, không thể thực hiện được.

0

Bạn có thể tạo giao diện riêng của mình MyQueue với tất cả các phương thức mà Hàng đợi đã trừ phương pháp xóa và sử dụng phương thức đó. Bạn có thể cung cấp giao diện MyQueue một phương thức Queue toQueue() trả về đối tượng được chuyển đổi thành hàng đợi.

Quy trình chuyển đổi này có thể liên quan đến việc trả về một phiên bản mới Queue ẩn danh, trong đó, đối với mỗi phương pháp X, chỉ cần gọi/trả lại this. [X]. Đối với phương thức xóa, bạn gọi số this.remove() nhưng sau đó trả lại giá trị boolean thay vì giá trị trả lại của cuộc gọi this.remove().

+0

Điều này khó xảy ra có ích. Mục đích của việc thực hiện 'java.util.Queue' là để các cá thể của lớp này có thể được chuyển vào các phương thức mà mong đợi một' java.lang.Queue'. Việc triển khai 'MyQueue' sẽ không đạt được điều này. –

+0

@AndrzejDoyle Tôi đồng ý, nhưng trên cơ hội ra rằng giải pháp này sẽ làm việc cho các trường hợp sử dụng của OP hoặc tia lửa thảo luận thêm, tôi figured tôi muốn đăng nó –

Các vấn đề liên quan