2011-10-19 32 views
7

Implementuję interfejs Map<V,K> i Collection<V> w jednej klasie, ale metoda remove(Object) występuje w obu interfejsach, w związku z tym zaćmienie pokazuje mi pewne błędy. Typy zwrotów są różne, jeden zwraca boolean i drugi V, ale wydaje się to nie mieć znaczenia.Java przesłonięcie dwóch interfejsów, zderzenie nazw metod

Czy jest jakiś sposób informowania java/eclipse, która metoda jest nadpisana?

EDYCJA: Posiadam interfejs, który muszą zostać zaimplementowane wszystkie wartości, dostarcza wartość za pomocą metody getKey(), umożliwiając zapisanie funkcji dodawania dla mapy. Ale wydaje się, że nie ma sposobu, aby pozwolić tej jednej klasie wyglądać jak mapa i kolekcja w tym samym czasie?

+0

Możesz chcieć powiedzieć, co zamierzasz zrobić. "Mapa" jest zasadniczo słownikiem klucz-wartość. "Kolekcja" to tylko garść rzeczy. Nie są koncepcyjnie tym samym. Czy masz na myśli, że chcesz 'Map', której * klucze * mogą być dostępne jako' Kolekcja'? Ponieważ 'keySet()' robi to na przykład. –

Odpowiedz

8

Nie, nie ma bezpośredniej drogi.

W rzeczywistości dynamiczne powiązanie uwzględnia podpis wykluczający zwracany typ, więc kompilator Java nie może zaakceptować dwóch metod dla tej samej klasy, które mają ten sam podpis, ale różnią się typami zwracanymi. Jeśli dwie metody mają te same nazwy i te same parametry, niż MUSZĄ mieć również ten sam zwracający typ, niestety dla ciebie.

Jedynym sposobem jest podzielenie zachowania w dwóch różnych klasach i ich komponowanie. Może metoda taka jak Collection<V> asCollection() lub coś w tym stylu.

+0

Oto dokumentacja do JLS dotycząca sygnatury metody: http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.4.2 – rit

1

Nie, nie ma sposobu na rozwiązanie takich konfliktów.

Należy rozważyć użycie composition i delegation zamiast dziedziczenia dla co najmniej jednego z dwóch interfejsów lub można podzielić funkcjonalność klasy na dwie klasy, to naprawdę zależy od konkretnego problemu.

+0

Jeśli sprawię, że moja klasa Map rozszerzy klasę kolekcji i ustawi finał metody remove w klasie Collection, nadal otrzymam błędy w klasie Map. Albo jak mam użyć tej kompozycji? –

+0

Jeśli utworzysz "Mapę rozszerzającą kolekcję", będziesz używać dziedziczenia. Jeśli to, co próbujesz zrobić, to zasadniczo mapa z pewnymi niestandardowymi różnicami, spraw, aby rozszerzyła tylko Mapę, a jeśli potrzebujesz Kolekcji wewnętrznie dla niektórych funkcji, możesz zadeklarować tę Kolekcję jako zmienną prywatną, a także odsłonić część potrzebne metody, jeśli to konieczne, za pomocą delegacji.Określasz metodę, która po prostu przekazuje wywołanie w podobny sposób na Twojej zmiennej prywatnej. – stivlo

+0

Dzięki, rozumiem, ale kiedy używam delegowania, moja klasa traci wygląd prawdziwej kolekcji. Aplikacje powinny używać tej implementacji, nie martwiąc się o konieczność wywoływania niektórych metodCollection(). Ale wydaje się to niemożliwe. –

1

Już Map ma już keySet(), który jest zbiorem kluczy. Dlaczego potrzebujesz również kolekcji? Jeśli tak, po prostu wykonaj dwie metody, takie jak asMap i asCollecton, które zwracają różne typy.

+0

Piszę niestandardową metodę add() dla Mapa. –

+0

I? .. Zawsze można zrobić 'yourObject.asMap(). Add (.. niestandardowe ..)'. – kan

0

Prawdopodobnie potrzebujesz skład zamiast dziedziczenia. Niestety Java nie obsługuje tego na poziomie języka - mam na myśli, że można to zrobić, ale jest niepotrzebnie pracochłonna.

0

Musisz ponownie przemyśleć swój projekt. Zasadniczo mapa różni się od kolekcji. Pomyśl o metodzie Collection.add(). Czy ma sens dodanie obiektu do mapy bez klucza lub klucza bez wartości?

Twój najlepszy zakład (myślę i zależnie od twojej aplikacji) jest zaimplementowanie mapy, ale gdy potrzebujesz kolekcji, użyj jednej z jej metod, aby uzyskać zestaw kluczy, wartości lub par wartości klucza.

+0

Spójrz na moją edycję, istnieje interfejs zapewniający metodę uzyskiwania klucza z wartości. Wiem, co chcę zrobić, jedyne pytanie brzmi :-) –

+0

'add' było tylko przykładem. Mój komentarz stoi. – JeremyP