我想首先概述一下我在构造一个包含双链表的类(我没有使用Java内置类)时使用的类:
class Node { //Forms the nodes of the list
private Object element;
private Node next;
private Node prev; //....other methods etc.
}
public class mylist implements Iterable<Node> {
Node head; Node tail; //....
@Override
public Iterator<Node> iterator() {
return new myit(this);
}
public class myit implements Iterator<Node> {
mylist set;
Node curr;
myit(mylist input) {
set=input;
curr=set.head;
}
@Override
public boolean hasNext() {
return (!(curr.getNext()==set.tail));
}
@Override
public Node next() {
if (this.hasNext()) return curr.getNext();
}
}
public class Myset {
mylist set;
//...
public void Delete(Object o) {
for(Node p: this.set) {
if(p.getElement().equals(o)) {
Node q=p.getNext();
p.getPrev().setNext(q);
q.setPrev(p);
break;
}}
}
public static void main(String[] as) {
Myset m=new Myset();
for(int i=1; i<5;i++) {
m.Insert(new Card(i));
}
for(Node n: m.set){
Card x=n.getElement(); //ERROR HERE
System.out.println(x.number());
}}
为了清楚起见,这里的所有类都在单独的文件中定义。Card是我创建的一个单独的类。我得到一个错误,说类型不匹配:不能从对象转换到卡在指示的行。我该如何克服这一点?此外,正如您可能已经注意到的那样,我已经重载了迭代器函数,以便在我的链表类中使用它,使用的方法是如何在Java中将迭代器实现为类的属性。如果你注意到故障/有任何建议,我将非常感激。我还有一个关于Myset中Delete方法的问题。由于上面的错误,我还没有能够运行代码,但我对此表示怀疑。我对Java相当陌生,我习惯了在c中使用指针的想法,所以p和q作为"指针"指向mylist中原始节点的内存位置,这会成功删除节点吗?
正如评论中建议的那样,一个快速而简单的解决方案是简单地将getElement()
的返回值转换为Card
:
Card x = (Card) n.getElement();
编译器不知道你只在列表中存储Card
对象,因为它可以保存Object
(或Object
本身)的任何子类。在您的情况下,您作为程序员必须告诉编译器您正在做什么-如果 100%确定列表将只包含Card
对象,则可以安全地将返回值强制转换为Card
。