¿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

Respuestas a la pregunta(1)

Su respuesta a la pregunta