Вам необходимо установить границу для переменной типа T
, чтобы объекты этого типа гарантированно имели метод .compareTo
.
public class HeapSort<T extends Comparable<? super T>> implements Function<T, U>
Похоже, вы определили свой собственный Comparable<T>
интерфейс, но это T
не связано, переменная универсального типа применяется только в пределах класса или метода, где она определена.Вы должны удалить этот дополнительный Comparable<T>
интерфейс.
В качестве альтернативы, если вы хотите использовать несопоставимые типы для T
, ваша идея использования Comparator<T>
верна, ноВаша реализация по умолчанию не будет работать:
this.c = (e1, e2) -> ((Comparable<T>)e1).compareTo(e2);
Если T
уже не является сопоставимым типом, приведение к Comparable<T>
завершится неудачей.Я бы предложил не иметь конструктора по умолчанию и всегда передавать Comparator<T>
.При использовании типа, который сопоставим, вы можете передать его Comparator.naturalOrder()
.
. Вы можете использовать компаратор для замены compareTo
вызовов:
if((rightChild<size)&& (c.compare(ar[rightChild],ar[rightChild])>0)){
if(c.compare(ar[root],ar[child])<0){