Czy interfejs może rozszerzyć wiele interfejsów w Javie? Ten kod wygląda na prawidłowy w moim IDE i kompiluje się:
interface Foo extends Runnable, Set, Comparator<String> { }
ale słyszałem, że wielokrotne dziedziczenie nie jest dozwolone w Javie. Dlaczego wydaje się, że istnieje wyjątek dla interfejsów?
java
inheritance
multiple-inheritance
extends
Prateek
źródło
źródło
Odpowiedzi:
Tak, możesz to zrobić. Interfejs może rozszerzyć wiele interfejsów, jak pokazano poniżej:
Pojedyncza klasa może również implementować wiele interfejsów. Co się stanie, jeśli dwa interfejsy mają metodę definiującą tę samą nazwę i podpis?
Jest trudny punkt:
Wtedy pojedyncza implementacja działa dla obu :).
Przeczytaj mój pełny post tutaj:
http://codeinventions.blogspot.com/2014/07/can-interface-extend-multiple.html
źródło
void test()
zi interfejs B zboolean test()
? (Czy to kuzyn problemu z diamentem ?) __Wypróbowałem go i wydarzyła się rozsądna rzecz: niedozwolone, jeśli typ zwracania jest inny.Interfejs może przedłużyć wiele interfejsów .
Klasa może zaimplementować wiele interfejsów .
Jednak klasa może rozszerzać tylko jedną klasę .
Uważaj, jak używasz słów
extends
iimplements
kiedy mówisz ointerface
iclass
.źródło
Odpowiedź brzmi: tak.
Według JLS
źródło
Na stronie dokumentacji Oracle dotyczącej wielu typów dziedziczenia możemy znaleźć tutaj dokładną odpowiedź . Tutaj powinniśmy najpierw poznać typ wielokrotnego dziedziczenia w java: -
Java ”nie obsługuje wielokrotnego dziedziczenia stanu, ale obsługuje wielokrotne dziedziczenie implementacji z metodami domyślnymi od wersji Java 8 oraz wielokrotne dziedziczenie typów z interfejsami.
Następnie pojawia się pytanie o „problem z diamentami” i jak sobie z tym radzi Java: -
W przypadku wielokrotnego dziedziczenia implementacji, kompilator java podaje błąd kompilacji i prosi użytkownika o jego naprawienie poprzez podanie nazwy interfejsu. Przykład tutaj: -
Więc tutaj otrzymamy błąd, ponieważ: - interfejs D dziedziczy niepowiązane wartości domyślne metody () z typów B i C interfejs D rozszerza B, C
Możesz to naprawić na przykład: -
Podsumowując, możemy powiedzieć, że java nie obsługuje wielokrotnego dziedziczenia stanu, ale obsługuje wielokrotne dziedziczenie implementacji i wielokrotne dziedziczenie typu .
źródło
Możesz przedłużyć wiele,
Interfaces
ale nie możesz przedłużyć wieluclasses
.Powodem, dla którego w Javie nie jest możliwe rozszerzenie wielu klas, jest złe doświadczenie z C ++, gdzie jest to możliwe.
Alternatywą dla dziedziczenia wielopunktowego jest to, że klasa może implementować wiele interfejsów (lub interfejs może rozszerzać wiele interfejsów)
źródło
Myślę, że twoje zamieszanie wiąże się z dziedziczeniem wielokrotnym, w którym robienie tego jest złą praktyką, aw Javie jest to również niemożliwe. Jednak implementowanie wielu interfejsów jest dozwolone w Javie i jest również bezpieczne.
źródło
na przykład spójrz tutaj: http://www.tutorialspoint.com/java/java_interfaces.htm
źródło