Дженерики и Wild Card - PullRequest
       4

Дженерики и Wild Card

0 голосов
/ 12 февраля 2019

Я разрабатываю реализацию BinarySearchTree, хотя я застрял с проблемой, с которой я не сталкивался раньше.У меня также мало понимания того, как это исправить:

The type K is not a valid substitute for the bounded parameter <K extends Comparable<? super K>> of the type BST<K,V>

Это ошибка, которую я получаю после создания абстрактного класса с именем BST<K extends Comparable<? super K>, V> и последующего создания другого класса, расширяющего этот файл с именем RectangleBST<K,V>.Итак, RectangleBST<K,V> extends BST<K,V>, но я получаю ошибку, когда использую BST<K, V>.

. Одним из решений было использование extends BST<Integer, Rectangle>, хотя это означало бы, что я теперь унаследовал методы специально для типа Key of Integer.и значение типа Rectangle?

Другое может заключаться в том, чтобы вместо этого использовать RectangleBST, хотя я считаю, что я планирую сравнить ключи в BST, а не RectangleBST?

1 Ответ

0 голосов
/ 12 февраля 2019

Параметры универсального типа не обязательно должны называться одинаково, поэтому, чтобы лучше увидеть разницу, давайте переименуем их:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...