Реализация сопоставимого интерфейса (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 >, Ничего более.

Другие вопросы по тегам