riccac ha scritto:
1)Quali sono tipi che non si possono comparare?
Qualunque classe è comparabile SE offre una qualche API apposita per la comparazione dei suoi oggetti. Se ti faccio una classe Persona con dei metodi es. isMinore, isMaggiore ecc... oppure un singolo metodo
comparaPersona(Persona altra), allora gli oggetti Persona li puoi comparare. Ma non c'entra nulla con Comparable/Comparator, perché la API è differente.
Comparable/Comparator sono state fatte proprio per "standardizzare" il principio della comparazione tra gli oggetti. Altrimenti sarebbe stato il caos ... ognuno faceva e metteva i metodi di comparazione che gli pareva.
riccac ha scritto:
2)Il metodo compareTo mi assicura anche che i due oggetti comparati siano dello stesso tipo no?
No, di per sé no. String è Comparable<String> mentre Integer è Comparable<Integer>. Entrambi sono Comparable ma NON sono comparabili tra di loro.
riccac ha scritto:
cioè non è che mi fa risultare "corretto" il confronto tra un Integer e una String anche se entrambi i tipi sono comparable?
Se due oggetti NON sono mutualmente comparabili tra di loro, da qualche parte si schianterà con un bel ClassCastException.
Prima dell'avvento dei generics, il compareTo aveva come parametro un Object e tipicamente si doveva fare es.:
public class Persona implements Comparable { // pre Java 5
.....
public int compareTo(Object altroOggetto) {
Persona altraPersona = (Persona) altroOggetto;
// .... confronta this con altraPersona
}
}
C'è praticamente sempre di mezzo un cast, che fallisce ovviamente se viene passato un oggetto che non è quello aspettato.
riccac ha scritto:
E poi comunque dovrei implementarmi da solo il metodo compareTo e ritorniamo sempre al punto di partenza no?
Per il min/max non devi
implementare il compareTo ma semplicemente
invocare quello che è già implementato negli oggetti della collezione da esaminare.
riccac ha scritto:
cioè come faccio a sapere che tipo di dati comporranno la collezione per creare un compareTo che funzionerà di conseguenza?
Se fai un metodo es.
public static <T extends Comparable<? super T>> T valoreMassimo(Collection<? extends T> coll)
Il tipo usabile all'interno del metodo è T. Puoi avere una variabile 'massimo' di tipo T. Iterando sulla collezione hai dei T ... che hanno compareTo (perché Comparable, già imposto dal bound nella parametrizzazione).