Hola.
Estoy implementando una cola de prioridad mediante un montículo y me he encontrado con un problema al que no dejo de darle vueltas. En realidad es una duda más que un problema.
Vereis, mi montículo esta implementado con un ArrayList y yo quiero que sea genérico, así que pongamos ArrayList<E>. Como ya sabeis para hacer un montículo la gracia es que los elementos se puedan comparar entre si para ordenar la estructura. El problema que me surge es que yo en principio no se que objetos va a contener mi cola de prioridad, asi que he definido dos constructores:
Código PHP:
public class Monticulo<E> extends AbstractQueue<E> {
private ArrayList<E> monticulo;
private Comparator<E> comparator;
//Contructor 1, sin comparator
public Monticulo(){
monticulo = new ArrayList<E>();
comparator = null;
}
//Constructor 2, con comparador
public Monticulo(Comparator<E> c){
monticulo = new ArrayList<E>();
comparator = c;
}
}
Y luego a la hora de comparar mi idea era la siguiente.
1 - He usado el contructor con comparador, uso ese comparador para comparar.
2 - El comparador es nulo, uso el método compareTo() de la interfaz Comparable, se supone que ese método lanza una ClassCastException si los objetos no se pueden comparar.
Código PHP:
private boolean esMenorQue(int i, int j) {
if (comparator != null) {
return comparator.compare(monticulo.get(i), monticulo.get(j)) == -1;
} else {
return monticulo.get(i).compareTo(monticulo.get(j)) < 0;
}
}
La pregunta es la siguiente, por supuesto el método compareTo() da error de compilación, ya que mis elementos no implementan Comparable. ¿Debería cambiar mis declaraciones de tipo ArrayList<E>, AbstractQueue<E> y Monticulo<E> a --------- <E extends Comparable>? En principio si, así se elimina el error, pero entonces ¿cual es el sentido del ClassCastException? Si la genericidad ya me está forzando a que mis objectos sean comparables nunca saltará esa excepción ¿no? Y lo que es peor, si quiero usar mi montículo con objetos que
no implementen Comparable, usando el primer constructor para especificar un Comparator específico para esos objectos, ¿me lo permitirán las declaraciones de tipo ---------<E extends Comparable>? Entiendo que no ¿no?
Bueno pues eso es, si necesitais más información, código o lo que sea para poder orientarme un poco decidmelo y os lo facilito.
Un saludo y gracias por vuestro tiempo.