2013-06-18 10 views
7

Próbuję zbudować klasę, która implementuje Queue i Map. Oba złącza określają sposób remove(Object), ale z różnych typów returnImplementowanie niekompatybilnych interfejsów

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 

    //... 
} 

typu usuwanie K powoduje, te dwa podpisy Sposób zderzają. Nie mogę mieć jednego z nich, ponieważ jest to niepoprawne zastąpienie i nie mogę mieć obu, ponieważ mają one ten sam podpis. Czy jest jakiś sposób, żebym mógł współistnieć z tymi dwoma interfejsami?

+0

z mankietu, nie wydaje mi się to możliwe. –

+0

W jaki sposób twoja klasa zdecyduje, której użyć, jeśli wywołasz remove (key)? –

+0

[Nie wygląda dobrze] (http://stackoverflow.com/questions/573621/is-the-c-sharp-exicit-implementation-of-interface-present-in-java) –

Odpowiedz

4

Nie wierzę, że jest to możliwe w tym konkretnym przypadku. Jeśli obie klasy zwróciły typy obiektów, miałbyś trochę szans, ale ponieważ mieszałeś typy podstawowe i obiektowe, nie ma kompatybilnego typu, który obsługiwałby oba interfejsy.

Innym podejściem może być implementacja odpowiednich interfejsów, które są kompatybilne, a następnie użycie kompozycji do przechowywania wewnętrznej struktury i wywoływania funkcji mapowania w zależności od potrzeb. Zakładałoby to, że nie musisz spełniać ani być użyteczny jako oba interfejsy, ale przede wszystkim ten, który musisz wyeksponować.

Jednakże, jeśli chcesz uczynić tę klasę wymienną jako dwa niekompatybilne interfejsy, nie można tego zrobić.

0

Można utworzyć własny interfejs MyQueue ze wszystkimi metodami, które Kolejka ma minus metoda usuwania i użyć tego. Możesz dać interfejsowi MyQueue metodę, która zwraca obiekt przekonwertowany na kolejkę.

Ten proces konwersji może obejmować po prostu powraca nową instancję anonimowego Queue, która dla każdej metody X, po prostu wybiera/powrót this. [X]. W przypadku metody remove należy wywołać this.remove(), ale następnie zwrócić wartość boolowską, a nie zwracaną przez wywołanie this.remove().

+0

Jest mało prawdopodobne, aby być przydatnym. Celem implementacji 'java.util.Queue' jest to, że instancje tej klasy można przekazać do metod, które oczekują' java.lang.Queue'. Wdrożenie 'MyQueue' nie osiągnie tego. –

+0

@AndrzejDoyle Zgadzam się, ale przy braku szansy, że to rozwiązanie zadziała w przypadku użycia PO lub zapoczątkuje dalszą dyskusję, pomyślałem, że mogę to opublikować –

Powiązane problemy