Как исправить проблему «метод не применим к аргументам» в этом коде, который использует дженерики

Я пытаюсь реализовать метод итерации в моем связанном списке, чтобы сделать его более читабельным и более компактным, поскольку он используется более одного раза. Моя проблема с кодом, который я предполагаю, заключается в неправильном понимании обобщений Java с точки зрения объявления метода. Это ошибка, которую я получаю:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: The method iterate(Nodes<T extends Nodes<T>>) in the type LinkedList<T> is not applicable for the arguments (Nodes<T>)

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

  public class LinkedList<T> extends ListTemplate<T>
     {
       Nodes<T> head;
       Nodes<T> tail;
//declaration of method
       private <T extends Nodes<T>> Nodes<T> iterate(Nodes<T> head)
     {
    Nodes<T>iterate=head;
    while(iterate.getNext()!=null)
     {
        iterate=iterate.getNext();
     }
    return iterate;
     }
//the method call
public void Enqueue(T data)
    {
        Nodes<T>new_node=new Nodes<T>(data);
        //head is set for null when list is empty
        if(head==null)
        {
        //if the list is empty both head and tail will box new_node
        head=new_node;
        tail=new_node;
        }
        //if we insert something to list head wont be null
        else if(head!=null)
        {
        tail=iterate(head);
        tail.setNext(new_node);
        }
}

Код работает, когда я не пытаюсь создать отдельный метод и реализовать его в коде. Ожидаемый результат, заставляющий этот метод перебирать список предоставленных мною узлов и возвращать последний узел. Я не уверен в своей ошибке, но, вероятно, декларация проблематична.

Всего 2 ответа


С этой строкой:

private <T extends Nodes<T>> Nodes<T> iterate(Nodes<T> head)

Вы объявляете метод iterate универсальным с собственным параметром типа T , который отличается от параметра типа класса LinkedList T

Как и метод Enqueue (который обычно пишется в нижнем регистре как enqueue ), метод iterate может просто использовать уже определенную область T определенным классом. Удалите объявление T в методе iterate :

private Nodes<T> iterate(Nodes<T> head)

Вы говорите, что T - это и тип содержимого узла, и тип возвращаемого объекта Nodes.

   private <T extends Nodes<T>> Nodes<T> iterate(Nodes<T> head)

Вы можете исправить это, сказав вместо этого:

   private Nodes<T> iterate(Nodes<T> head)

Есть идеи?

10000