1

我正在设计一个通用链表来创建字符串的链表。
但是我不断收到此错误:

Exception in thread "main" java.lang.NoSuchMethodError: Node.<init>(Ljava/lang/Object;)V
at LinkedList.addNode(LinkedList.java:10)
at LinkedList.<init>(LinkedList.java:22)
at Trial.main(Trial.java:7)


从堆栈跟踪中,错误是在 LinkedList 的 addNode() 方法中生成的。我包括此方法的定义以及 Node 类的定义。
链表 addNode()

public void addNode(T n) {
        Node<T> temp = new Node<T>(n);
        if(start==null) {
            start = temp;
            current = start;
        } else {
            end.setNext(temp);
        }
        end =temp;
    }


节点.java

public class Node<T>{
private T n;
Node next;
Node(T n) {
    this.n = n;
    next = null;
}
public void setNext(Node nextNode) {
    next = nextNode;
}
public Node getNext() {
    return next;
}
public T getN() {
    return n;
}
@Override
public String toString() {
    if(n instanceof String)
        return n.toString();
    else {
        return T.toString();
    }
}

}



链表.java

public class LinkedList<T>{
Node start;
Node end;
Node current;
private static final long serialVersionUID = 901L;
    LinkedList(T n) {
        addNode(n);
    }
    public void addNode(T n) {
        Node<T> temp = new Node<>(n);
        if(start==null) {
            start = temp;
            current = start;
        } else {
            end.setNext(temp);
        }
        end =temp;
    }

    LinkedList(T[] n) {
        for(T print : n)
        addNode(print);
    }
    public void addNode(T[] n) {
        if(n!=null) {
            for (T values : n) {
                addNode(values);
            }
        }
    }

    public void incC() {
        current = current.getNext();
    }
    public void insert(T n) {
        Node newNode = new Node(n);
            if(current==start){
                newNode.setNext(current);
                start = newNode;
            }else {
                Node tempstart = start;
                Node prevAdd=null;
                while(tempstart!=current){
                    prevAdd = tempstart;
                    tempstart = tempstart.getNext();
                }
                prevAdd.setNext(newNode);
                newNode.setNext(current);
            }
    }

    public void find(T x) {
        Node tempstart;
        tempstart = start;
        while (tempstart!=null) {
            if(tempstart.getN()==x) {
                System.out.println("Element found");
                tempstart = tempstart.getNext();
            } else {
                tempstart = tempstart.getNext();
            }
        }
    }
    public void delete(T x) {
        Node previous=null;
        Node tempstart = start;
        while(tempstart!=null) {
        if(tempstart.getN()==x) {
            if(previous ==null) {
                previous = tempstart;
                tempstart = tempstart.getNext();
                start = tempstart;
                previous.setNext(null);
                previous = null;
            } else {
                tempstart = tempstart.getNext();
                previous.setNext(tempstart);
            }
        }else {
            previous = tempstart;
            tempstart = tempstart.getNext();
        }
        }
    }
    @Override
    public String toString() {
        Node tempNode = start;
        String str = "Values: ";
        while (tempNode!=null) {
            str = str + " " + tempNode.toString();
            tempNode = tempNode.getNext();
        }
        return str;
    }
}

试用版.java

public class Trial {
public static void main(String[] args) {
    String[] para = {"Hollo","this","is","me"};
    LinkedList<String> L1;
    L1 = new LinkedList<String>(para);
    System.out.println(L1);
}
4

5 回答 5

4
return T.toString();

这不起作用。T 是一个类型变量,由于类型擦除,仅在编译时可用。

但除此之外,我看不出有什么问题,您需要从 LinkedList 类中发布更多代码。

于 2012-05-30T06:36:36.263 回答
2

您应该将startend和中的current字段声明为类型,而不是。不要在代码中的任何地方使用原始类型,因为它们会转换为.LinkedList< T >nextNode< T >Node< T >NodeNode< Object >

于 2012-05-30T07:18:00.763 回答
1

您的类Node无法编译,因此您可能应该先解决该问题,然后再继续:

return T.toString();

没有意义。可能只是写这个:

return n.toString();

现在就足够了。

于 2012-05-30T06:38:12.393 回答
1

在 Node.java 中,在方法中

@Override 
public String toString() { 
    if(n instanceof String) 
        return n.toString(); 
    else { 
        return T.toString(); 
    } 
} 

// 下面的语句抛出编译错误。返回 T.toString();

于 2012-05-30T06:46:54.710 回答
1

您的NodeConstructor is not public,因此如果您从另一个包中的类调用它,它将不起作用。

于 2012-05-30T07:17:07.130 回答