¿Por qué obtengo una excepción de reparto de clase (con genéricos, comparables)?
Estoy tratando de implementar una lista de matriz ordenada y sin ordenar. Ambos extienden una clase llamada AbstractArrayMyList que contiene operaciones / implementaciones comunes: toString, clear, etc.
Aquí está mi código para AbstractArrayMyList (que implementa una interfaz genérica que definí)
public abstract class AbstractArrayMyList<E> implements MyList<E> {
protected E[] elementData;
.....
}
Elegí hacer elementData protegido para que las listas de matrices especializadas ordenadas y no ordenadas puedan acceder y realizar operaciones en él. Aquí está mi declaración / código para la lista de matriz ordenada
public class ArrayListSorted<E extends Comparable<E>> extends AbstractArrayMyList<E>
Todo esto se compila bien. Sin embargo, cuando pruebo mi código, con estas líneas
ArrayListSorted<Integer> toTestInteger = new ArrayListSorted<Integer>()
toTestInteger.insert(0);
assertEquals(toTestInteger.get(0).intValue(), 0);
Me sale una clase de excepción
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Comparable;
at myarraylist.ArrayListSorted.getIndex(ArrayListSorted.java:38)
eso ocurre aquí
@Override
public int getIndex(E value) {
int lo = 0;
int hi = size;
while (lo <= hi) {
// Key is in a[lo..hi] or not present.
int mid = lo + (hi - lo) / 2;
if (value.compareTo(elementData[mid]) < 0) hi = mid - 1;
La excepción ocurre en la misma línea que compareTo. ¿Alguien sabe cuál es el problema? Definí el comodín acotado, E extiende Comparable, lo que significa que cualquier clase que desee trabajar con ArrayListSorted debe implementar la interfaz Comparable ...
Quiero decir que incluso tengo la sintaxis correcta, dehttp://docs.oracle.com/javase/tutorial/java/generics/upperBounded.html, tipo extiende clase / interfaz