2013-03-30 2 views
0

У меня есть простой вопрос.Реализация LinkedList определенного класса, а не общий тип

Я определяю класс, используя связанный узел, определенный моим собственным, как вложенный класс.

Я только хочу использовать этот узел для узла ArrayLists строки, а не для общего типа.

Я определил узел для общего типа T, а именно HNode < T>, но я хочу добавить методы в этот класс Node, который использует методы ArrayList. Например,

public void forward(int n) { //return boolean?? 
     HNode<T> targetNode; 
     for(int i=0; i<n; i++) { 
      targetNode = this._next; 
     } 
     targetNode._datum.add(this._datum.remove(this._datum.size()-1)); 
    } 

внутри моего класса узлов.

Он продолжает предупреждать, что метод size() не определен для типа T, поэтому я рассматриваю возможность изменения определения класса на узел ArrayList строки.

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

Другой вопрос. Я объявил переменную targetNode и назначил ее внутри цикла for. Однако он выдает предупреждение о том, что targetNode необходимо назначить.

public void forward(int n) { //return boolean?? 
     HNode<T> targetNode = this; 
     for(int i=0; i<n; i++) { 
      targetNode = targetNode._next; 
     } 
     targetNode._datum.add(this._datum.remove(this._datum.size()-1)); 

Возможно, это лучший вариант?

спасибо !!

ответ

1

Существует лучший способ сделать это!

Поскольку вы хотите использовать метод .size() из Arraylist, я бы предложил сделать свой узел (и охватывающий класс) тип интерфейса Collection.

Интерфейс Collection гарантирует, что объект будет реализован методом .size(), и это устранит вашу ошибку компиляции.

Arraylist наследует от Collection следующим образом:
Collection-->AbstractList-->Arraylist

Использование Collection вместо родового T через класс:

HNode<Collection> targetNode; 

Это позволит ваш класс обрабатывать все классы которые реализуют интерфейс Collection, который представляет собой широкую группу классов s. Это поддерживает вашу абстракцию и значительно увеличивает код повторного использования затем совершает весь свой класс только Arraylist

+0

Я определил свой класс \t частный класс HNode { Я думаю, это может сработать? – user25409

+0

@ user25409 Определите частный класс следующим образом: 'HNode ' –

0

«Я только хочу, чтобы использовать этот узел для узла ArrayLists строковых, а не для общего типа»

Затем создать свой тип, как это, падение общего, использование: HNode вместо HNode<T>

И создайте поле типа Arraylist<String>.

+0

Вы имеете в виду HNode >? Это не сработало, и именно поэтому я задал этот вопрос. – user25409

+0

Извините, я все еще редактировал свой ответ, теперь его лучше :), Это соответствует вашим потребностям? – bluevoid

0

Чтобы иметь возможность, используя методы интерфейса List нужно просто заменить

HNode<T> 

с

HNode<List> 

Появляется предупреждение «targetNode должно быть назначено», потому что ваш цикл цикла не будет выполнен, если n = 0. Вот почему targetNode может не назначаться. И вот почему вы shuld добавить проверку диапазона или вы можете получить NullPointerException на этой линии

targetNode._datum.add(this._datum.remove(this._datum.size()-1)); 

Edit: Кроме того, похоже, ваша последняя строка логически некорректным. Метод remove() возвращает результат операции (boolean), а не сам удаленный объект. Вы должны явно получить этот элемент перед удалением или просто изменить свою коллекцию на LinkedList и вызвать метод removeLast().

+0

Ответ на 'Редактировать:': Я проверил Javadoc, и есть два метода удаления. remove() возвращает boolean, remove (int index) возвращает удаленный объект. – user25409

+0

Да, я перепутал вкладку браузера и посмотрел в интерфейс Collection javadoc вместо List. Извините за эту ошибку. Но вот почему вы должны использовать интерфейс List, а не коллекцию, как предлагалось @awashburn. –

Смежные вопросы