Java:通用类异常

时间:2012-05-30 06:32:23

标签: java generics exception singly-linked-list

我正在设计一个通用链接列表来创建字符串的链接列表 但是我一直收到这个错误:

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);
}

5 个答案:

答案 0 :(得分:4)

return T.toString();

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

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

答案 1 :(得分:2)

您应该将start中的endcurrentLinkedList< 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,因此如果您从另一个包中的类调用它,它将无效。