Ver Mensaje Individual
  #1 (permalink)  
Antiguo 25/04/2011, 04:10
iplazlac
 
Fecha de Ingreso: diciembre-2010
Mensajes: 8
Antigüedad: 13 años, 5 meses
Puntos: 1
compareTo(), genericidad y ClassCastException

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<Emonticulo
  private 
Comparator<Ecomparator;

  
//Contructor 1, sin comparator
  
public Monticulo(){
    
monticulo = new ArrayList<E>();
    
comparator null;
  }

  
//Constructor 2, con comparador
  
public Monticulo(Comparator<Ec){
     
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 iint 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.