ezio1400 ha scritto:
Vorrei che mi aiutaste a capire il tipo di dati che verranno memorizzati nella seguente classe
ListaOrdinata<E extends Comparable<? super E>>{}
Per far capire il Comparable<? super E> generalmente si fa un esempio con una piccola gerarchia di classi, ad esempio Frutto e poi Mela/Arancia.
Scenario 1)
class Frutto implements Comparable<Frutto> { ... }
class Mela extends Frutto { ... }
class Arancia extends Frutto { ... }
Scenario 2)
class Frutto { ..... }
class Mela extends Frutto implements Comparable<Mela> { ..... }
class Arancia extends Frutto implements Comparable<Arancia> { ..... }
Entrambi gli scenari sono validi, nessuno dei due è più giusto o sbagliato dell'altro. Sono scelte che si devono fare a livello di design.
Nel primo caso si stabilisce che tutti i Frutto siano comparabili tra di loro (es. posso comparare un oggetto Mela con uno Arancia). Perché magari la comparazione è sul "peso" (proprietà che ha senso mettere in Frutto).
Nel secondo caso si stabilisce che ciascun tipo specifico è comparabile solo con sé stesso. Ovvero posso solo confrontare un oggetto Mela con un altro oggetto Mela .... non con uno Arancia.
Se ListaOrdinata fosse:
ListaOrdinata<E extends Comparable<E>>
funzionerebbe SOLO con il secondo scenario e non con il primo. Perché? Semplicemente perché con il primo scenario Mela è Comparable<Frutto> e questo NON corrisponde a <E extends Comparable<E>>
Se tentassi di fare:
.... = new ListaOrdinata<Mela>();
Con il primo scenario il E viene preso per Mela ma Mela è Comparable<Frutto> e quindi non compilerebbe.
Se invece è appunto:
ListaOrdinata<E extends Comparable<? super E>>
allora funziona in entrambi gli scenari. Questa versione con Comparable<? super E> insomma è più "ampia" ed è da preferire.