如何在使用泛型的代码中解决“不适用于自变量的方法”问题

时间:2019-05-17 16:04:33

标签: java generics

我试图对我的链表实现一个迭代方法,以使其更具可读性和紧凑性,因为它被多次使用。我假设的代码问题是,在方法声明方面没有正确理解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 个答案:

答案 0 :(得分:2)

此行:

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

您要声明iterate方法是通用的,具有其 own T类型的参数,该参数不同于类LinkedList的类型参数T

类似于Enqueue方法(通常将其小写为enqueue),iterate方法可以简单地使用已经定义的类作用域T。删除T方法上的iterate声明:

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

答案 1 :(得分:0)

您是说T既是节点内容的类型,又是 也是返回的Nodes对象的类型。

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

您可以这样说来解决:

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