Небезопасное понижение класса Object до Comparable вызывает проблемы

Я реализую набор структур данных и решил попробовать реализацию maxheap через массив, так как это одна из распространенных реализаций для maxheaps. Для этого у меня есть интерфейс под названием MaxHeap<T> который принимает Comparable типы T и подпись следующего класса:

 public class ArrayMaxHeap<T extends Comparable<T>> implements MaxHeap<T> {

T должен быть Comparableили же я не смогу сравнивать элементы друг с другом при выполнении операций добавления и удаления из кучи. Проблема заключается в конструкторе класса:

public class ArrayMaxHeap<T extends Comparable<T>> implements MaxHeap<T> {

    private T[] data;
    private int last;
    private static final int INIT_CAPACITY = 10;

    /**
     * Creates an empty ArrayMaxHeap with the default capacity.
     */
    public ArrayMaxHeap(){
        data = (T[])(new Object[INIT_CAPACITY]);
        last = 0;
    }

Тип литья data бросает ClassCastExceptionпотому что уныние от Object, который не Comparableнебезопасно. Я попал в стену с этим, и я не уверен, как я буду реализовывать конструктор. Любая помощь будет оценена.

2 ответа

Решение

Это своего рода ограничение дженериков. Вместо этого просто объявите ваш массив как Object[] и разыграть элемент, который вы пытаетесь вернуть. Нечто похожее на то, что ArrayList делает.

public E get(int index) {
    rangeCheck(index);

    return elementData(index);
}

E elementData(int index) {
    return (E) elementData[index];
}

где elementData является

private transient Object[] elementData;

Если вы контролируете, что происходит, нет проблем.

Я собираюсь связать вопрос и ответ в комментарии Рохита, потому что это блестяще.

Просто измените это на

data = (T[])new Comparable[INIT_CAPACITY];
Другие вопросы по тегам