Реализация сопоставимого интерфейса (Java) в программе Binary heaps в курсе алгоритмов Принстонского университета
Я не использую обширную Java для программирования, просто имею базовые знания языка. Я делаю этот курс по алгоритмам на Coursera: https://www.coursera.org/learn/algorithms-part1/ Программа для двоичной кучи, приведенная в этом курсе:
public class MaxPQ<Key extends Comparable<Key>>
{
private Key[] pq;
private int N;
public MaxPQ(int capacity)
{ pq = (Key[]) new Comparable(capacity + 1);
}
public boolean isEmpty()
{ return N==0;}
public void insert(Key key)
{ pq[++N] = x;
swim(N);}
private void swim(int k)
{ while(k>1 && less(k/2,k))
{
exch(k,k/2);
k=k/2;
}
}
public key delMax()
{
Key max = pq[1];
exch(1,N--);
sink(1);
pq[N+1] = null; //To prevent loitering.
return max;
}
private void sink(int k)
{
while(2*k<=N){
int j= 2*k;
if(j<N && less(j,j+1))j++;
if(!less(k,j)) break;
exch(k,j);
k=j;}
}
private boolean less(int i, int j)
{ return pq[i].compareTo(pq[j])>0; }
private void exch(int i, int j)
{ Key t = pq[i]; pq[i] = pq[j]; pq[j] = t; }
Метод compareTo() будет определен в определении класса Key, когда он переопределяет метод по умолчанию compareTo в сопоставимом интерфейсе.
Теперь я понимаю, что сопоставимым является встроенный интерфейс в java.lang. При определении класса MaxPQ использовался общий тип: открытый класс MaxPQ
Поскольку Comparable является интерфейсом, а Key расширяет этот интерфейс, это означает, что ключ также должен быть интерфейсом. Теперь я не понимаю, как это работает. Может, кто-нибудь объяснит мне, что хорошего сделал бы интерфейс как универсальный тип, и почему Key должен расширять Comparable.
Было бы очень полезно, если бы вы могли также привести пример того, как можно определить ключ (используя сопоставимые интерфейсы).
Спасибо заранее.
2 ответа
Чего вам не хватает, так это понимания
<Key extends Comparable<Key>>
Это не означает, что Key является интерфейсом... Это означает, что Key является подклассом Comparable и может рассматриваться как таковой.
Comparable<Key> c = new Key();
В конце концов, не имеет значения, реализует ли Key интерфейс Comparable или расширяет класс Comparable, потому что в обоих случаях он может действовать как Comparable - и имеет методы, которые есть в Comparable.
Key extends Comparable < Key >
означает только то, что Key
реализует интерфейс Comparable < Key >
, Ничего более.