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.