Tipi generici e sconosciuti

di il
3 risposte

Tipi generici e sconosciuti

Vorrei che mi aiutaste a capire il tipo di dati che verranno memorizzati nella seguente classe
ListaOrdinata<E extends Comparable<? super E>>{}

Allora da quello che ho capito è che il tipo generico E è vincolato , cioè deve implementare l'interfaccia comparable. Il "pezzo" <? super E> significa che il tipo sconosciuto può essere un qualunque supertipo del tipo E. Non mi è chiaro l'intero significato <E extends Comparable<? super E>> però.

Un grazie per le eventuali risposte.

3 Risposte

  • Re: Tipi generici e sconosciuti

    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.
  • Re: Tipi generici e sconosciuti

    E che differenza ci sarebbe tra ListaOrdinata<extends Comparable <? Super E>> e ListaOrdinata<extends Comparable <? extends E>>?
  • Re: Tipi generici e sconosciuti

    ezio1400 ha scritto:


    E che differenza ci sarebbe tra ListaOrdinata<extends Comparable <? Super E>> e ListaOrdinata<extends Comparable <? extends E>>?
    ListaOrdinata<E extends Comparable <? extends E>> non ha senso e non funzionerebbe, nel senso che non riusciresti nemmeno ad invocare il compareTo di un oggetto che tecnicamente corrisponderebbe pure alla forma indicata.

    Questo riguarda un concetto basilare dei bounds nei generics che viene chiamato "get and put principle".
Devi accedere o registrarti per scrivere nel forum
3 risposte