Если вы хотите, чтобы NodeList и MyList содержали только Comparable
элементов, вы можете заменить общий параметр T
на что-то вроде:
public class NodeList<T extends Comparable> {
Или
public class NodeList<T extends Comparable<T>> {
Изамените, где вы используете Comparable
на T
.Таким образом, вы знаете, что T, по крайней мере, реализует методы Comparable.
Oracle учебники для дженериков должны помочь вам освоить их.
Одна из проблем, с которой вы можете столкнуться, заключается в том, что вы ссылаетесь на переменные-члены из статических функций, как в leftHalf
:
for ( int countToMiddle = 0; countToMiddle < middle ; countToMiddle++ ) {
leftSide.addEnd(nodes);
}
nodes
- это переменная-член, то есть нестатическая переменная, поэтомуВы не можете вызвать это из статических методов.В этом примере вы должны получить его из переданного MyList
:
for ( int countToMiddle = 0; countToMiddle < middle ; countToMiddle++ ) {
leftSide.addEnd(list.nodes);
}
И то же самое относится и к другим статическим методам, которые пытаются использовать переменные-члены.
Кроме того, причина, по которой вы получаете ошибку типа: addEnd(S) in MyList<S> cannot be applied to (NodeList<T>)
, заключается в том, что S
, в соответствии с вашим параметром типа, является сопоставимым.NodeList
не расширяет Comparable!
У вас есть два решения:
- Сделайте NodeList extension Comparable таким образом, чтобы вы могли передать его в
MyList.addEnd
- Сделатьперегрузка (т. е. другой метод с тем же именем) для addEnd, который принимает NodeList и добавляет все элементы в переданном NodeList в MyList
или предлагает другое решение, которое лучше соответствует потребностямиз ваших классов.
Хотя я понимаю, что вы реализуете связанный список только для того, чтобы отточить свои навыки для интервью (я желаю вам удачи!), я просто хочу добавить, что есть обобщенный LinkedList уже доступен на Java.