Параметры универсального типа не обязательно должны называться одинаково, поэтому, чтобы лучше увидеть разницу, давайте переименуем их:
BST<A extends Comparable<? super A>, B>
RectangleBST<C, D> extends BST<C, D>
Это работает подобно вызову функции:
bst(int a, int b)
rectangleBst(int c, int d) {
bst(c, d);
}
Однако он работает только в том случае, если c
совместим с a
.Я имею в виду, если C
совместим с A
.
Это не так, поскольку C
может быть любого типа, даже типа, который не реализует / не расширяет Comparable
.Поскольку для A
требуется параметр типа для реализации / продления Comparable
, C
несовместим.
Чтобы сделать его совместимым, вам также необходимо ограничить C
типами, которые реализуют / расширяют Comparable
:
RectangleBST<C extends Comparable<? super C>, D> extends BST<C, D>
Теперь C
совместимо с A
.
Хорошо, теперь используйте нужные имена:
BST<K extends Comparable<? super K>, V>
RectangleBST<K extends Comparable<? super K>, V> extends BST<K, V>
Просто помните, что K
в RectangleBST
- это не такой же K
, как K
в BST
.Это другой K
, который сопоставлен с K
в BST
, так же, как C
был сопоставлен с A
.