2015-09-25 51 views
9

Mam na przykład interfejs A i B. A ma (abstrakcyjną) metodę o nazwie foo. B rozszerza A.Czy ma sens przesłonięcie metody w interfejsie

Możliwe jest zastąpienie foo w interfejsie B nawet przy @Override, ale czy jest jakakolwiek sytuacja, w której to ma sens? Nie ma nic do przesłonięcia, ponieważ obie metody muszą być abstrakcyjne i nie mieć ciała. Więc myślę, że nie ma sytuacji, w której to ma sens, prawda?

Dlaczego więc możliwe jest przesłonięcie interfejsu?

Odpowiedz

11

Jedna sytuacja jest wtedy, gdy chcesz zaktualizować dokumentację Javadoc do zastanowienia się bardziej konkretną umowę w sposobie w podinterfejsu, jak to ma miejsce w przypadku Collection#addAll(Collection) i List#addAll(Collection):

  • Collection#addAll(Collection):

    Dodaje wszystkie elementy z określonej kolekcji do tej kolekcji (operacja opcjonalna) ...

  • List#addAll(Collection:

    Dołącza wszystkich elementów w określonej kolekcji na końcu tej listy, w kolejności, w jakiej są one zwrócone przez iterator określonej kolekcji (opcjonalnie praca) ...

podinterfejsu można również dodać domyślną implementację począwszy Java 8.

+0

'addAll()' jest świetnym przykładem, ale być może powinieneś pokazać, jaka jest różnica w umowie. – dkatzel

+0

Tak. Nazywa się to Typem Covariant Return. Zobacz https://en.wikipedia.org/wiki/Covariance_and_contravariance_%28computer_science%29#Covariant_method_return_type –

+0

@ ErickG.Hagstrom W moim przykładzie oba zwracają 'void', ale funkcja typu covariant zwraca wciąż ogólnie :) – manouti

8

Podtyp może nakładać więcej warunków, zmieniać typ zwrotu, zmieniać typy rzutów. Jednym z przykładów

interface AutoCloseable 
    void close() throws Exception 

interface Closeable extends AutoCloseable 
    void close() throws IOException 

(A podtyp może również zastąpić usunięte z wersji podpisu metody ... ale to stara historia)

W java8, sub-interface może dostarczyć domyślny Impl dla abstrakcyjnej metody

interface DummyCloseable extends Closeable 
{ 
    default void close() 
    { 
     // do nothing 
    } 
+0

Co z parametrami typu? Czy z tymi może być coś fajnego? –

+0

To ma sens, masz na myśli Typ Covariant Return, taki jak ten przykład http://stackoverflow.com/questions/14694852/can-overridden-methods-differ-in-return-type – stonar96

+0

Myślę, że poza erausre, potrzebują "tego samego "parametry typu - http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.2 – ZhongYu