Foros del Web » Programación para mayores de 30 ;) » Java »

compareTo(), genericidad y ClassCastException

Estas en el tema de compareTo(), genericidad y ClassCastException en el foro de Java en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 25/04/2011, 04:10
 
Fecha de Ingreso: diciembre-2010
Mensajes: 8
Antigüedad: 13 años, 4 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.

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:46.