【问题标题】:String class cannot be cast to Node class字符串类不能转换为节点类
【发布时间】:2020-03-11 04:45:23
【问题描述】:

我有一个家庭作业要重构一些代码以使用泛型。我觉得我在课堂上做得很正确。这是我所拥有的

public class Node<T> {

    private T content;
    private T next;

    public Node(T content, T next) {
        this.content = content;
        this.next = next;
    }

    public T getContent() {
        return content;
    }

    public void setContent(T content) {
        this.content = content;
    }

    public T getNext() { return next; }

    public void setNext(T next) {
        this.next = next;
    }
}
public class LinkedList<T> {
    private Node head;

    public LinkedList() {
        head = null;
    }

    public void addFirst(T content) {
        Node<Object> ptr = head;
        head = new Node<>(content,ptr);
    }

    public void addLast(T content) {
        Node<Object> last = new Node<>(content,null);
        if (head == null) {
            head = last;
        } else {
            Node<Node> ptr = new Node(content, head);
            while(ptr.getNext() != null) {
                ptr = ptr.getNext();
            }
            ptr.setNext(last);
        }
    }

当涉及到实例化时,我得到一个 ClassCastException 错误:

“线程“main”中的异常 java.lang.ClassCastException:类 java.lang.String 无法转换为类 edu.cscc.Node(java.lang.String 在加载器“bootstrap”的模块 java.base 中; edu.cscc.Node 在 loader 'app' 的未命名模块中)"

这是导致错误的主类中的内容。

public class Main {

    public static void main(String[] args) {
        list1();
        list2();
    }

    // Use linked list with Strings
    public static void list1() {
        LinkedList<String> llist = new LinkedList<String>();
        llist.addFirst("one");
        llist.addLast("two");
        llist.addLast("three");
        llist.addFirst("zero");
        llist.addLast("xxxx");
        llist.addFirst("yyyyy");
        llist.deleteLast();
        llist.deleteFirst();
        System.out.println(llist);
        llist.deleteFirst();
        llist.deleteLast();
        llist.deleteFirst();
        llist.deleteLast();
        System.out.println(llist);
    }

    // Use linked list with Integers
    public static void list2() {
        LinkedList<Integer> llist = new LinkedList<Integer>();
        llist.addFirst(1);
        llist.addLast(2);
        llist.addLast(3);
        llist.addFirst(0);
        llist.addLast(142);
        llist.addFirst(-97);
        llist.deleteLast();
        llist.deleteFirst();
        System.out.println(llist);
        llist.deleteFirst();
        llist.deleteLast();
        llist.deleteFirst();
        llist.deleteLast();
        System.out.println(llist);
    }
}

谁能指出这是什么原因造成的?

【问题讨论】:

  • 我们能看到完整的 LinkedList 类吗?但即使我注释掉你省略的函数,我也不会收到任何错误。

标签: java generics


【解决方案1】:

Node 中,您的next 变量类型错误:

public class Node<T> {

private T content;
private Node<T> next; // this is a reference to the next node

public Node(T content, Node<T> next) { // next is a Node<T>
    this.content = content;
    this.next = next;
}

...

public Node<T> getNext() { return next; }

public void setNext(Node<T> next) {
    this.next = next;
}

您的LinkedList 还需要更频繁地引用 T:

public void addFirst(T content) {
    Node<T> ptr = head;
    head = new Node<T>(content, ptr);
}

当列表中至少有一项时,addLast 的逻辑似乎很奇怪。您应该找到列表中的最后一项,然后在其后添加一个节点。

Node<T> lastItem = head;
while(lastItem.getNext() != null) {
    lastItem = lastItem.getNext();
}
lastItem.setNext(new Node(content, last););

【讨论】:

  • 谢谢,这对我有帮助。
【解决方案2】:

我认为你在课堂上搞砸了一些类型。您可能应该有以下内容:

public class Node<T> {
    private final T content;
    private Node<T> next;

    public Node(T content, Node<T> next) {
        this.content = content;
        this.next = next;
    }

    public T getContent() {
        return content;
    }

    public void setContent(T content) {
        this.content = content;
    }

    public Node<T> getNext() { 
       return next; 
    }

    public void setNext(Node<T> next) {
        this.next = next;
    }
}

public class LinkedList<T> {
    private Node<T> head;

    public LinkedList() {
        head = null;
    }

    public void addFirst(T content) {
        head = new Node<>(content, head);
    }

    public void addLast(T content) {
        Node<T> last = new Node<>(content, null);
        if (head == null) {
            head = last;
        } else {
            Node<T> ptr = head;
            while (ptr.getNext() != null) {
                ptr = ptr.getNext();
            }
            ptr.setNext(last);
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多