2015-09-25 24 views
9

Ho per esempio un'interfaccia A e B. A ha un metodo (astratto) chiamato foo. B estende A.Ha senso sovrascrivere un metodo in un'interfaccia

È possibile sovrascrivere foo nell'interfaccia B anche con @Override, ma esiste una situazione in cui ciò abbia senso? Non c'è nulla da escludere, perché entrambi i metodi devono essere astratti e non avere corpo. Quindi immagino che non ci sia alcuna situazione in cui ciò abbia senso, giusto?

Quindi, perché è possibile eseguire l'override in un'interfaccia?

risposta

11

Una situazione è quando si desidera aggiornare la documentazione Javadoc per riflettere un contratto più specifica nel metodo nella sottointerfaccia, come è il caso con Collection#addAll(Collection) e List#addAll(Collection):

  • Collection#addAll(Collection):

    Aggiunge tutti gli elementi della raccolta specificata a questa raccolta (operazione facoltativa) ...

  • List#addAll(Collection:

    Aggiunge tutti gli elementi della collezione specificato alla fine di questa lista, nell'ordine in cui essi vengono restituiti dal iteratore della collezione specificato (operazione opzionale) ...

un subinterface può anche aggiungere un'implementazione di default a partire Java 8.

+0

'addAll()' è un ottimo esempio, ma forse dovresti mostrare qual è la differenza nel contratto. – dkatzel

+0

Sì. Questo è chiamato un tipo di ritorno covariante. Vedi https://en.wikipedia.org/wiki/Covariance_and_contravariance_%28computer_science%29#Covariant_method_return_type –

+0

@ ErickG.Hagstrom Nel mio esempio entrambi restituiscono 'void' ma la caratteristica di tipo covariante restituisce ancora in generale :) – manouti

8

Un sottotipo può imporre più condizioni, modificare il tipo di ritorno, modificare i tipi di lancio. Un esempio

interface AutoCloseable 
    void close() throws Exception 

interface Closeable extends AutoCloseable 
    void close() throws IOException 

(A sottotipo può anche sostituire con una versione cancellata della firma del metodo ... ma questa è vecchia storia)

In java8, sub-interfaccia può fornire un impl di default per il metodo astratto

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

E i parametri di tipo? Può succedere qualcosa di divertente con quelli? –

+0

Questo ha senso, vuoi dire un tipo di ritorno covariant come quello http://stackoverflow.com/questions/14694852/can-overridden-methods-differ-in-return-type – stonar96

+0

Suppongo che, a parte l'erausre, abbiano bisogno di "lo stesso "digita i parametri - http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.2 – ZhongYu