无法从Object转换为<myclass>错误和查询指针

时间:2016-07-03 15:17:48

标签: java object linked-list converter

我想在构建一个包含双向链表的类(我没有使用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());
            }}

要清楚,这里的所有类都是在单独的文件中定义的。卡片是我创建的一个单独的课程。我收到一个错误,其中显示类型不匹配:无法在指示的行中从Object转换为Card。我该如何克服这个问题? 另外,您可能已经注意到我已经使用How to implement iterator as an attribute of a class in Java中建议的方式重载了迭代器函数以将其用于我的链接列表类。如果您发现故障/有任何建议,我将非常感激。 我还有一个与Myset中的Delete方法有关的问题。由于上面的错误,我还没有能够运行代码,但我对此有疑问。我对Java很陌生,而且我已经习惯了在C中使用指针的想法。所以p和q用作指针&#39;到mylist中原始节点的内存位置,这会成功删除节点吗?

1 个答案:

答案 0 :(得分:0)

正如评论中所建议的,一个简单快捷的解决方案是简单地将getElement()的返回值转换为Card

Card x = (Card) n.getElement();

编译器不知道您只在列表中存储Card个对象,因为它可以包含Object(或Object本身的任何子类) 。在您的情况下,您作为程序员必须告诉编译器您正在做什么 - 如果您 100%确定该列表将只包含Card个对象,您可以安全地将返回值强制转换为Card