基本链表类型队列,在 Java + 请求外行术语中扩展了一个非常基本的 Node<T>
Posted
技术标签:
【中文标题】基本链表类型队列,在 Java + 请求外行术语中扩展了一个非常基本的 Node<T>【英文标题】:Basic Linked List type Queue that extends a very basic Node<T> in Java + Requesting Laymans Terms 【发布时间】:2013-02-23 06:50:36 【问题描述】:首先,是的,这是学校的作业,但我不是在寻找以任何方式重写或彻底检查我的代码的人。我的问题是:
我被要求编写一个类来创建一个扩展 Node 的队列(后者如下所示)
public class Node<T>
protected T data;
protected Node<T> next;
我已经编写了(很可能是非常粗略的)方法来执行此操作,以及将整数类型存储到队列中的基本测试程序(希望如此)。我不知道所有的专业术语,我已经阅读了“泛型”文档,但可能错过了一个关键点,我已经阅读了链表的工作原理(他们的例子在节点类中有很多,这是我的东西) m 不允许在此分配中编辑),以及循环数组等。当我运行我的代码时,我得到了一个我没想到的关于类型的错误。我将发布我的相关代码,有人可以大致解释一下我做了什么来得到这个(而是......在我的代码中我不应该使用的地方?)
public class Queue<T> extends Node<T>
public Node base;
public Node end;
public void enqueue(T item)
Node newItem = new Node();
newItem.data = item;
newItem.next = null;
if (isEmpty()) //Sets to item count of 1
this.base = newItem; //Base becomes the new item
this.base.next = this.end; //Base Points Next as End
this.end.next = this.base; //End points to the one before it (base)
else //Sets to item count above 1.
this.end.next.next = newItem; //The Last Item Now Points Next as the New Item (End is never counted as an item)
this.end.next = newItem; //End now points to the next final item.
public T dequeue()
if (isEmpty())
return (null);
else
T item = this.base.data;
if (this.base.next == this.end)
this.base = null;
this.end = null;
else
this.base = this.base.next;
return (item);
public int size()
int count = 0;
for (Node node = base; node != null; node = node.next)
count++;
return count;
public boolean isEmpty()
return (base == null);
public Queue()
this.base = null;
this.end = null;
TestQueue.java 代码是:
public class TestQueue
public static void main(String args[])
QueueStuff<Integer> firstQueue = new QueueStuff<>();
firstQueue.enqueue (66);
firstQueue.enqueue (6);
firstQueue.enqueue (666);
firstQueue.enqueue (0);
firstQueue.enqueue (6666);
//firstQueue.printQueue();
错误是这样的:
incompatible types.
T item = this.base.data;
^
required: T
found: Object
where T is a Type variable: T extends Object declared in class Queue
【问题讨论】:
【参考方案1】:这里:
public Node base;
public Node end;
应该是:
public Node<T> base;
public Node<T> end;
问题是:泛型都是关于编译时的类型检查。当你执行任务时:
T item = this.base.data;
编译器不允许,因为它不进行类型检查。它不输入检查,因为:
public Node base;
相当于:
public Node<Object> base;
【讨论】:
啊,好的。谢谢。这是一个非常有效的观点。 edit 那么我的最后一个问题是,当我改变它时,我最终在 public int size() int count = 0; 之后的 处出现错误for(节点节点=基;节点!=空;节点=节点.next)计数++; 返回计数; 说我错过了一个对我来说似乎很明显的退货声明? 没有问题。我不知道你为什么会出现这个错误,可能检查一下你的大括号。 我在 Notepad++ 中编码,然后在 Windows Powershell 中使用 javac filename.java 请忽略我的第二个问题。我误读了它所在的文件...我在第二个错误所指的另一个相关类中有另一个未完成的方法。【参考方案2】:问题是你的字段是原始类型
public Node base;
public Node end;
这意味着它们在技术上被视为与Node<Object>
相同,并且因为您是泛型类型T
比Object
更具体,所以您不能为其分配Object
。例如你可以做
Node test = new Node();
test.data = Integer.valueOf(1);
test.data = "One";
但是在这个例子中 T
被 Integer
取代,这意味着你可以尝试这个
Node test = new Node()
test.data = "One";
Integer item = test.data;
P.S我不确定Queue是否需要扩展Node,只是使用Node来存储数据。
【讨论】:
也感谢您对此的意见。这也是有用的信息。我现在可以让我的程序正常工作、入队和出队,并在这些方法中对我的功能进行了一些相当大的调整(除了在 base 和 end 的节点声明之后添加以上是关于基本链表类型队列,在 Java + 请求外行术语中扩展了一个非常基本的 Node<T>的主要内容,如果未能解决你的问题,请参考以下文章