Wildcard<? super T>... HELP!

di il
15 risposte

15 Risposte - Pagina 2

  • Re: Wildcard<? super T>... HELP!

    Francesco93 ha scritto:


    quindi è praticamente LA STESSA COSA SCRIVERE:

    public class Element<T extends Comparable<? super T>> implements Comparable<Element<? extends T>>

    e:

    public class Element<T extends Comparable<? super T>> implements Comparable<Element<T>>

    giusto?
    No, in realtà non è esattamente la stessa cosa.

    Tra (uso il mio Contenitore):

    Forma 1)
    class Contenitore<T extends Comparable<? super T>> implements Comparable<Contenitore<? extends T>>

    Forma 2)
    class Contenitore<T extends Comparable<? super T>> implements Comparable<Contenitore<T>>

    Con la prima forma è possibile fare:
    Contenitore<Frutto> cf = new Contenitore<Frutto>(new Mela());
    Contenitore<Arancia> ca = new Contenitore<Arancia>(new Arancia());
    
    int res = cf.compareTo(ca);
    Con la seconda forma no, quest'ultima invocazione di compareTo sarebbe rifiutata.

    E con la prima forma comunque non ci sarebbero problemi. Se posso scrivere Contenitore<Frutto>, vuol dire che Frutto deve essere Comparable (di <Frutto> chiaramente), altrimenti già qui non sarebbe accettato. Quindi anche Mela/Arancia sono Comparable<Frutto>.

    Pertanto se Mela e Arancia sono comparabili tra di loro, allora è anche vero e sensato che un Contenitore<Frutto> che contiene una Mela possa essere comparato con un Contenitore<Arancia> che contiene una Arancia. Perché alla fin fine sono gli oggetti contenuti ad essere comparati.

    E giusto per completezza, con entrambe le forme comunque NON puoi comparare un Contenitore<Mela> con un Contenitore<Arancia> nonostante Mela e Arancia siano comparabili.

    Quindi Comparable<Element<? extends T>> è sì un pochino più ampio ma non così tanto utile come potrebbe sembrare.
Devi accedere o registrarti per scrivere nel forum
15 risposte