Chi estende le interfacce? E perché?

19

AFAIK, la mia classe extends classi genitore e implements interfacce. Ma trovo una situazione in cui non posso usare implements SomeInterface . È la dichiarazione di un tipo generico. Ad esempio:

public interface CallsForGrow {...}

public class GrowingArrayList <T implements CallsForGrow>  // BAD, won't work!
                              extends ArrayList<T> 

Qui l'uso di implements è sintatticamente vietato. Ho pensato innanzitutto che l'uso dell'interfaccia all'interno di < > è proibito a tutti, ma no. È possibile, devo solo usare extends invece di implements . Di conseguenza, sto "estendendo" un'interfaccia. Questo altro esempio funziona:

public interface CallsForGrow {...}

public class GrowingArrayList <T extends CallsForGrow>  // this works!
                              extends ArrayList<T> 

Per me sembra un'incongruenza sintattica. Ma forse non capisco alcune finezze di Java 6? Ci sono altri posti in cui dovrei estendere le interfacce? L'interfaccia, intendo estendere, dovrebbe avere alcune funzioni speciali?

    
posta Gangnus 29.02.2012 - 09:54
fonte

4 risposte

24

Nel caso di variabili di tipo generico, al compilatore non interessa se T è una classe, un'interfaccia, un enum o un'annotazione. Tutto ciò che importa è che si tratta di un tipo con un determinato set di sottotipi e super-tipi.

E non vi è alcun motivo per complicare la sintassi solo perché in un altro punto (dove si implementa effettivamente un'interfaccia) la distinzione tra classi e interfacce è rilevante (ad esempio se implement un'interfaccia, è necessario implementare tutto metodi che definisce, ma non è necessario, se si extend a (classe non astratta).

Supponendo per un momento che tu debba scrivere implements qui, allora avresti anche bisogno di una sintassi separata per enum valori (invece di scrivere <E extends Enum<E>> ) e annotazioni (che puoi facilmente dichiarare utilizzando <A extends Annotation> ).

L'unico posto in cui hai bisogno di scrivere implements è nel punto in cui implementi effettivamente l'interfaccia. Al quel punto (e solo quel punto) la differenza è importante, perché devi implementare i metodi definiti nell'interfaccia. Per tutti gli altri, non importa se qualsiasi dato A è una classe base o un'interfaccia implementata di B : è un super-tipo e questo è tutto ciò che conta.

Nota anche che c'è un altro posto dove usi extends con le interfacce:

interface A {
}

interface B extends A {
}

A questo punto implements sarebbe sbagliato, perché B non implementa A .

    
risposta data 29.02.2012 - 09:58
fonte
5

Quando Java 5, e in particolare i generici, era inizialmente reso disponibile agli sviluppatori che avevano registrato un interesse, la sintassi era molto diversa. Invece di Set<? extends Foo> e Set<? super Bar> ha avuto Set<+Foo> e Set<-Foo> . Tuttavia, il feedback era che non era chiaro se + significasse più specifico o più ampio (più classi) . Sun ha risposto a tale feedback modificando la sintassi, ma all'interno del vincolo di non introdurre nuove parole chiave, il che sarebbe stato un problema di compatibilità con le versioni precedenti.

Il risultato è che nessuno dei due è del tutto naturale. Come si osserva, extends è sovraccarico per parlare di interfacce "estendendo" delle classi, che non è la lingua utilizzata in altri contesti; e super è sovraccarico per significare "è una superclasse di", che è la direzione opposta della relazione precedentemente espressa dalla parola chiave, cioè riferita a una superclasse.

Tuttavia, i fondamenti di ciò che un'interfaccia è non sono interessati da questo cambiamento e non introducono interfacce speciali che sono estese in un modo nuovo.

    
risposta data 29.02.2012 - 13:58
fonte
2

Ci sono degli svantaggi sia nel consentire che nel proibire tale sintassi, e quelli di permettere sono molto maggiori.

Pensaci.

La separazione di interfaccia e implementazione è uno degli idiomi di programmazione fondamentali. Per questo motivo, la sintassi che consente di eseguire l'ortografia "dell'interfaccia implementa qualcosa" sarebbe più grave di una che utilizza il segno più per indicare la moltiplicazione degli operandi.

    
risposta data 29.02.2012 - 12:14
fonte
-1

Uno deve capire interfaccia programmazione guidata come passaggio successivo durante la comprensione di un'interfaccia. Indica qual è l'uso effettivo dell'interfaccia. Che ruolo gioca in un programma Java (o qualsiasi altra lingua).

    
risposta data 01.07.2013 - 15:16
fonte

Leggi altre domande sui tag