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.