Ho difficoltà a cercare di capire perché le due dichiarazioni di metodi hanno risultati diversi.
Sulla prima firma del metodo è ovvio che non puoi confrontare mele con mele e arance con Orange, perché nessuno di loro implementa Paragonabile < >.
Ma sul secondo metodo sono rimasto sorpreso dal fatto che potresti effettivamente confrontare le mele con mele e arance con le arance.
Ricordo che su una versione precedente di IntelliJ (14) una chiamata al secondo metodo con un elenco di mele o arance stava dando un errore di compilazione. Ma le versioni più recenti di IntelliJ non segnalano più questo problema.
Sarei grato se qualcuno potesse spiegarmi qual è la differenza tra i due metodi di firma usando l'esempio di Fruit.
class Fruit implements Comparable<Fruit> {}
class Apple extends Fruit {
}
class Orange extends Fruit {
}
static <T extends Comparable<T>> T maxSimple(Collection<T> coll) {
}
static <T extends Comparable<T>> T max(Collection<? extends T> coll) {
}