Как исправить проблему «метод, не применимый к аргументам» в этом коде, который использует дженерики - PullRequest
1 голос
/ 17 мая 2019

Я пытаюсь реализовать метод итераций в моем связанном списке, чтобы сделать его более читаемым и более компактным, поскольку он используется более одного раза.Моя проблема с кодом, который я предполагаю, заключается в неправильном понимании обобщений 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 ]

2 голосов
/ 17 мая 2019

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

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)
0 голосов
/ 17 мая 2019

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

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

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

   private Nodes<T> iterate(Nodes<T> head)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...