Реализует vs расширяет в generics в Java

Может ли кто-нибудь сказать мне, каковы различия между первым и вторым кодами? MaxPQ обозначает очередь приоритетов, которая представляет собой набор объектов "Key", которые можно сравнивать друг с другом.

Код 1:

public class MaxPQ<Key extends Comparable<Key>>{
...
}

Код 2:

public class MaxPQ<Key implements Comparable<Key>>{
...
}

Второй код не компилируется, но мне неинтересно, почему нам нужно расширять вместо реализации интерфейсов при использовании общего.

Ответ 1

Разница довольно проста: второй фрагмент кода не компилируется и никогда не будет. С generics вы всегда используете extends для классов и интерфейсов. Также можно использовать ключевое слово super, но оно имеет другую семантику.

Ответ 2

В дженериках нет инструментов. Второй код недействителен. Вероятно, вы сбиваете с толку:

public class MaxPQ implements Comparable<Key> {
   ...
}

Ответ 3

Я предполагаю, что было принято решение использовать extends для обоих интерфейсов и классов, потому что в случае описания универсального класса не имеет никакого значения аргумент типа, связанный с интерфейсом или классом.

Конечно, значение extends сильно отличается от его типичного использования в определении класса. У Angelika Langer действительно есть хороший текст о разных значениях extends в Java: "extends" всегда означает "наследование" ?