AFAIK, moje klasy klasy extends
nadrzędne i implements
interfejsy. Ale natrafiam na sytuację, w której nie mogę użyć implements SomeInterface
. Jest to deklaracja typów ogólnych. Na przykład:
public interface CallsForGrow {...}
public class GrowingArrayList <T implements CallsForGrow> // BAD, won't work!
extends ArrayList<T>
Tutaj używanie implements
jest składniowo zabronione. Najpierw pomyślałem, że używanie interfejsu wewnątrz <> jest w ogóle zabronione, ale nie. Jest to możliwe, muszę tylko użyć extends
zamiast implements
. W rezultacie „rozszerzam” interfejs. Ten kolejny przykład działa:
public interface CallsForGrow {...}
public class GrowingArrayList <T extends CallsForGrow> // this works!
extends ArrayList<T>
Wydaje mi się, że jest to niespójność składniowa. Ale może nie rozumiem niektórych zalet Javy 6? Czy są inne miejsca, w których powinienem rozszerzyć interfejsy? Czy interfejs, który mam rozszerzyć, powinien mieć jakieś specjalne funkcje?
źródło
extends
iimplements
, tylko patrząc na problem z perspektywy czystego systemu typów, nie ma różnicy.T
to klasa?T
może odwoływać się do typu interfejsu lubenum
typu.:
. a pod osłonami interfejs jest i zawsze był klasą abstrakcyjną z tym, że zawiera tylko niezaimplementowane elementy virtual (abstract
), aby umożliwić wielokrotne dziedziczenie. nie ma dosłownie żadnej różnicy międzyimplements
iextends
. oba można zastąpić tym samym słowem (extends
) lub dowolnym dowolnym symbolem (:
) i nic nie zostanie utracone.Kiedy Java 5, a w szczególności generyczne, została początkowo udostępniona programistom, którzy zarejestrowali zainteresowanie, składnia była zupełnie inna. Zamiast
Set<? extends Foo>
iSet<? super Bar>
miałSet<+Foo>
iSet<-Foo>
. Jednak informacja zwrotna była taka, że nie było jasne, czy+
oznacza bardziej szczegółowe czy szersze (więcej klas) . Firma Sun odpowiedziała na tę opinię, zmieniając składnię, ale pod warunkiem, że nie wprowadzi nowych słów kluczowych, co stanowiłoby problem z kompatybilnością wsteczną.W rezultacie żaden z nich nie jest całkiem naturalny. Jak widać,
extends
jest przeciążony, aby mówić o klasach „rozszerzających” interfejsy, co nie jest językiem używanym w innych kontekstach; isuper
jest przeciążony, co oznacza, że „jest nadklasą”, która jest odwrotnym kierunkiem relacji wyrażonej wcześniej przez słowo kluczowe, tj. odnosi się do nadklasy.Jednak zmiana ta nie ma wpływu na podstawowe elementy interfejsu i nie wprowadza specjalnych interfejsów, które zostały rozszerzone w nowy sposób.
źródło
Istnieją zarówno wady zezwalające na taką składnię, jak i zabraniające, a te zezwalające są znacznie większe.
Pomyśl o tym.
Rozdzielenie interfejsu i implementacji jest jednym z podstawowych idiomów programistycznych. Z tego powodu składnia pozwalająca na przeliterowanie „interfejs implementuje coś” byłaby tak samo zła, jak użycie znaku plus do oznaczenia mnożenia operandów.
źródło
Należy zrozumieć programowanie oparte na interfejsie jako kolejny krok podczas rozumienia interfejsu. Informuje, jakie jest rzeczywiste użycie interfejsu. Jaką rolę odgrywa w programie Java (lub innym języku).
źródło