ClassCastException при сравнении элементов в пользовательском ArrayOrderedList с помощью ComparatorJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 ClassCastException при сравнении элементов в пользовательском ArrayOrderedList с помощью Comparator

Сообщение Anonymous »

Я реализую упорядоченный список, который автоматически вставляет элементы в правильную отсортированную позицию с помощью компаратора. Список создается с нуля (без использования java.util.ArrayList) и использует внутренний необработанный массив.
Вот реализация базового списка:

Код: Выделить всё

public class ArrayList implements ListADT {
protected T[] array;
protected int count;
private static final int DEFAULT_CAPACITY = 10;

@SuppressWarnings("unchecked")
public ArrayList() {
array = (T[]) (new Object[DEFAULT_CAPACITY]); // internal storage
count = 0;
}

protected void expandCapacity() {
array = java.util.Arrays.copyOf(array, array.length * 2);
}
}

А вот упорядоченная версия:

Код: Выделить всё

public class ArrayOrderedList extends ArrayList implements OrderedListADT {

private Comparator comparator;

public ArrayOrderedList(Comparator comparator) {
this.comparator = comparator;
}

@Override
public void add(T element) {
if (count == array.length)
expandCapacity();

int i = 0;

// The error occurs here:
while (i < count && comparator.compare(element, array[i]) > 0) {
i++;
}

for (int j = count; j > i; j--) {
array[j] = array[j - 1];
}

array[i] = element;
count++;
}
}

Код: Выделить всё

public interface OrderedListADT extends ListADT {

public void add(T element);

}

Код: Выделить всё

public interface ListADT  extends Iterable{

public T removeFirst();

public T removeLast();

public T remove( T Object);
public T first();

public T last();

public boolean contains(T target);

public boolean isEmpty();

public int size();

public Iterator iterator();

public String toString();

}
Демонстрационный код:

Код: Выделить всё

public class ArrayOrderedListDemo {
public static void main(String[] args) {
ArrayOrderedList array1 = new ArrayOrderedList(Comparator.naturalOrder());
array1.add(2);
array1.add(5);
array1.add(4);
array1.add(1);
}
}

Ожидаемое поведение
Я ожидаю, что элементы будут вставлены в отсортированном порядке возрастания, например:
[1, 2, 4, 5]
Фактическая ошибка выполнения

Код: Выделить всё

Exception in thread "main" java.lang.ClassCastException:
class [Ljava.lang.Object; cannot be cast to class [Ljava.lang.Comparable;
([Ljava.lang.Object; and [Ljava.lang.Comparable; are in module java.base of loader 'bootstrap')
at OrderedList.ArrayOrderedList.add(ArrayOrderedList.java:14)
at OrderedList.ArrayOrderedListDemo.main(ArrayOrderedListDemo.java:10)
Что я понимаю на данный момент
Это происходит потому, что внутренний массив на самом деле является Object[], но операция сравнения косвенно предполагает, что сохраненные элементы будут находиться в Comparable[] (хотя я использую Comparator).
Ограничения
Это академическое упражнение, в котором:
Список должен быть реализован с нуля.
/>Я не могу использовать java.util.ArrayList.
Я не могу использовать отражение или Array.newInstance(...).
Я должен хранить элементы в общем массиве следующим образом:
array = (T[]) new Object[n];
Мой вопрос
Как я могу безопасно сравнивать элементы с помощью Comparator, когда они хранятся в Object[], без преобразование внутреннего массива в Comparable[] и без использования отражения?

Подробнее здесь: https://stackoverflow.com/questions/798 ... using-comp
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»