Ответ 1
Разница довольно проста: второй фрагмент кода не компилируется и никогда не будет. С generics вы всегда используете extends
для классов и интерфейсов. Также можно использовать ключевое слово super
, но оно имеет другую семантику.
Может ли кто-нибудь сказать мне, каковы различия между первым и вторым кодами? MaxPQ обозначает очередь приоритетов, которая представляет собой набор объектов "Key", которые можно сравнивать друг с другом.
Код 1:
public class MaxPQ<Key extends Comparable<Key>>{
...
}
Код 2:
public class MaxPQ<Key implements Comparable<Key>>{
...
}
Второй код не компилируется, но мне неинтересно, почему нам нужно расширять вместо реализации интерфейсов при использовании общего.
Разница довольно проста: второй фрагмент кода не компилируется и никогда не будет. С generics вы всегда используете extends
для классов и интерфейсов. Также можно использовать ключевое слово super
, но оно имеет другую семантику.
В дженериках нет инструментов. Второй код недействителен. Вероятно, вы сбиваете с толку:
public class MaxPQ implements Comparable<Key> {
...
}
Я предполагаю, что было принято решение использовать extends
для обоих интерфейсов и классов, потому что в случае описания универсального класса не имеет никакого значения аргумент типа, связанный с интерфейсом или классом.
Конечно, значение extends
сильно отличается от его типичного использования в определении класса. У Angelika Langer действительно есть хороший текст о разных значениях extends
в Java: "extends" всегда означает "наследование" ?