sto facendo un'interfaccia che poi sarà implementata con varie classi in modi diversi.
Esempio: la mia interfaccia si chiama "CasaInterfaccia" e le sue stanze "StanzaInterfaccia"
CasaInterfaccia deve essere iterabile, in modo tale che il suo Iterator iteri le sue stanze. Il problema è che a seconda delle implementazioni, il metodo iterator() restituirà cose diverse, ad esempio se eseguito su una CasaImplementazioneA mi dovrà dare un Iterator<StanzeImplentazioneA> oppure se su una CasaImplementazioneB un Iterator<StanzeImplentazioneB>
Il metodo non è un problema, basta fare
public Iterator<? extends CasaInterfaccia> iterator();
il punto è l'intestazione della classe, che consiste in un decisamente antiestetico
public interface CasaInterface<A extends CasaInterface<A>> extends Iterable<A>
per non parlare delle classi che la implmentano dove dovrei ripetere
public class CasaImplementazioneA implements CasaInterface<CasaImplementazioneA>
... per non parlare che per rispettare la semantica ogni qualvolta nomino una CasaInterface generica (cioè senza sapere com'è stata implementata) devo mettere un ? nella wildcard
Il problema insomma è che usare un Iterator<A> è diverso da Iterator<B> anche se B è una sottoclasse di A. Non voglio dire che non mi funziona, ma non mi piace. Soluzioni?
Esempio: la mia interfaccia si chiama "CasaInterfaccia" e le sue stanze "StanzaInterfaccia"
CasaInterfaccia deve essere iterabile, in modo tale che il suo Iterator iteri le sue stanze. Il problema è che a seconda delle implementazioni, il metodo iterator() restituirà cose diverse, ad esempio se eseguito su una CasaImplementazioneA mi dovrà dare un Iterator<StanzeImplentazioneA> oppure se su una CasaImplementazioneB un Iterator<StanzeImplentazioneB>
Il metodo non è un problema, basta fare
public Iterator<? extends CasaInterfaccia> iterator();
il punto è l'intestazione della classe, che consiste in un decisamente antiestetico
public interface CasaInterface<A extends CasaInterface<A>> extends Iterable<A>
per non parlare delle classi che la implmentano dove dovrei ripetere
public class CasaImplementazioneA implements CasaInterface<CasaImplementazioneA>
... per non parlare che per rispettare la semantica ogni qualvolta nomino una CasaInterface generica (cioè senza sapere com'è stata implementata) devo mettere un ? nella wildcard
Il problema insomma è che usare un Iterator<A> è diverso da Iterator<B> anche se B è una sottoclasse di A. Non voglio dire che non mi funziona, ma non mi piace. Soluzioni?