Para insertar objetos en TreeSets o utilizarlos como claves en TreeMaps, entre otras cuestiones, es necesario implementar la interfaz Comparable (a menos que se explicite un Comparator).
La interfaz Comparable es parametrizada
public interface Comparable
Esta interfaz requiere implementar un único método:
int compareTo(T o)
Entonces, si tengo una clase Persona, con atributo id, y quiero ordenar por ese criterio, puedo implementar:
public int compareTo(Persona p) {
return Integer.compare(this.id, p.id);
}
Ahora supongamos que quiero crear una colleccion llamada MiColeccion que guarde elementos ordenados y extienda TreeSet. Podría hacer algo como:
public MiColeccion extends TreeSet {}
Como TreeSet es una clase genérica, debería hacer también genérica la mía y colocar
public MiColeccion
Si defino mi colección de esta forma, puedo insertar objetos que no implementen Comparable, y (de no explicitar un Comparator) obtendré un error en tiempo de ejecución.
public void main(String[] args) {
MiCollection
#imagenConError
Entonces, para programar más defensivamente puedo obligar a que los objetos que se inserten implementen Comparable:
public MiColeccion
Como Comparable es una clase genérica también, la forma correcta sería indicar:
public MiColeccion
De esta forma, volviendo al ejemplo anterior, la instrucción MiCollection
public void main(String[] args) {
MiCollection
Pero qué pasa si decido extender la clase Persona, por ejemplo creando la clase Alumno?
public class Alumno extends Persona {}
Así cómo definimos las clases, Alumno implementa Comparable porque extiende de Persona. Pero implementa Comparable
public class Alumno extends Persona implements Comparable
Lamentablemente tendríamos que reimplementar el método compareTo en cualquier clase que la extienda.
Para evitar esto, podemos cambiar la definición de MiColeccion. En vez de Comparable
public MiColeccion
Al hacer esta modificación, puedo insertar objetos de tipo Alumno, aunque esa clase no implemente Comparable