我试图对我的链表实现一个迭代方法,以使其更具可读性和紧凑性,因为它被多次使用。我假设的代码问题是,在方法声明方面没有正确理解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);
}
}
当我不尝试制作单独的方法并在代码中实现时,代码就起作用了。使此方法迭代的预期结果将遍历我提供的节点列表,并返回最后一个节点。我不确定自己的错误,但声明可能有问题。
答案 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)