2010-04-21 24 views
12

Uaktualniam kod do Java 5 i wyraźnie nie rozumiem czegoś z Generics. Mam inne klasy, które raz wdrażają porównywalne, które udało mi się wprowadzić. Ale teraz mam klasę, która z powodu dziedziczenia kończy się próbą zaimplementowania Porównywalnych dla 2 typów. Oto moja sytuacja:Jak mogę wdrożyć opcję Porównywalne więcej niż jeden raz?

Mam następujących klas/interfejsy:

interface Foo extends Comparable<Foo> 

interface Bar extends Comparable<Bar> 

abstract class BarDescription implements Bar 

class FooBar extends BarDescription implements Foo 

z tym, pojawia się błąd „interfejs Porównywalne nie może być realizowany więcej niż raz z różnymi argumentami ...”

Dlaczego nie mogę zaimplementować funkcji compareTo (Foo foo) w FooBar, a także porównać (Bar) zaimplementowanej w BarDescription? Czy to nie jest po prostu przeciążanie metody?

Edytuj: Mam wiele zajęć, które rozszerzają BarDescription. Jeśli usuniemy parametr type dla Comparable on Bar, pozostawiając go w stanie nieprzetworzonym, to otrzymam garść ostrzeżeń kompilatora podczas sortowania wszystkich klas rozszerzających BarDescription. Czy to rozwiązałoby się z odpowiedzią na symbole wieloznaczne? Ta odpowiedź wydaje się dość skomplikowana i trudna do zrozumienia dla konserwacji.

+0

To samo pytanie, inna sprawa. Szukasz czegoś, co nazywa się wymazaniem typu. – falstro

+0

@row Coś o nazwie wildcards. –

+3

@ codeman73: ale po prostu nie można tego zrobić w Javie ... Java nie obsługuje prawdziwego parametrycznego polimorfizmu. Właśnie dlatego, gdy koncentrujesz się na "OO" zamiast "idiosynchątkach Java", generics Java są w większości bezcelowe: oczywiście, są one dobre dla "zbiorów" i dla programu proceduralnego (i dlatego dobrze pasują do mentalności 99% Programiści Javy), ale po prostu w ogóle nie jest to OO. To jest mój największy problem z generykami w Javie: nie możesz mieć zarówno * Handable * i * Handable * i który renderuje generics ** bezużyteczny ** z punktu widzenia OO. – SyntaxT3rr0r

Odpowiedz

14

Rodzice nie istnieją po skompilowaniu kodu bajtowego.

Ograniczenia od tego: Nie można wdrożyć/rozszerzyć dwóch lub więcej interfejsów/klas, które byłyby takie same bez parametru ogólnego i są różne w przypadku parametru ogólnego.

Co można zrobić, jeśli naprawdę naprawdę chcesz bezpieczeństwa typ to:

interface Foo<T extends Foo<?>> extends Comparable<T> 
interface Bar<T extends Bar<?>> extends Comparable<T> 
abstract class BarDescription<T extends Bar<?>> implements Bar<T> 
class FooBar extends BarDescription<FooBar> implements Foo<FooBar> 
+0

To działa. Nadal próbuję owinąć mi głowę. Dlaczego potrzebujemy Chciałbym, aby mój oryginalny post był bardziej konkretny. – user26270

+0

Ponadto, czy nie jest zbędne mieć interfejs Foo >? Inną kwestią jest to, że mam wiele klas rozszerzających BarDescription, ale nie Foo, a teraz wszystkie one muszą zdefiniować typ dla BarDescription i implementować compareTo (AnotherBarDescription), takie jak: class AnotherBarDescription rozszerza BarDescription user26270

+0

Tak, jest zbędny. ale Java Generics ma tam problemy. Jednym dużym problemem jest dziedziczenie (super typ to? Zamiast Object). Na przykład Foo foo = new Foo () jest niedozwolone. – mkorpela

8

chciałbym napisać parę Comparator s i być z nim zrobić.

1

Posiadanie wielu implementacji ogólnych interfejsów napotkałoby na problemy, gdyby wziąć pod uwagę symbole wieloznaczne.

To nie zależy od usunięcia.

Powiązane problemy