Небезопасное понижение класса 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];