我正在设计一个通用链接列表来创建字符串的链接列表
但是我一直收到这个错误:
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类的定义。
LinkedList 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;
}
Node.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();
}
}
}
的 LinkedList.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;
}
}
Trial.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);
}
答案 0 :(得分:4)
return T.toString();
这不起作用。 T是一个类型变量,仅在编译时由于类型擦除而可用。
但除此之外,我看不出有什么问题,你需要从LinkedList类中获取更多代码。
答案 1 :(得分:2)
您应该将start
中的end
,current
和LinkedList< T >
字段以及next
中的Node< T >
字段声明为类型{{ 1}},而不是Node< T >
。不要在代码中的任何位置使用原始类型,因为它们会转换为Node
。
答案 2 :(得分:1)
您的班级Node
无法编译,因此您可能需要先解决该问题,然后再继续:
return T.toString();
没有意义。可能只是写这个:
return n.toString();
现在已经足够了。
答案 3 :(得分:1)
在Node.java中,方法
@Override
public String toString() {
if(n instanceof String)
return n.toString();
else {
return T.toString();
}
}
//以下语句引发编译错误。 return T.toString();
答案 4 :(得分:1)
您的Node
构造函数不是public
,因此如果您从另一个包中的类调用它,它将无效。