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 クラスの定義を含めます。
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);
}
4

5 に答える 5

4
return T.toString();

これは機能しません。T は型変数であり、型消去のためにコンパイル時にのみ使用できます。

しかし、それとは別に、何が問題なのかわかりません。LinkedList クラスからさらにコードを追加する必要があります。

于 2012-05-30T06:36:36.263 に答える
2

、、およびフィールドを宣言し、startフィールドをではなくタイプとして宣言する必要があります。生の型は に変換されるため、コード内のどこでも使用しないでください。endcurrentLinkedList< T >nextNode< T >Node< T >NodeNode< Object >

于 2012-05-30T07:18:00.763 に答える
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

Nodeコンストラクタは ではないpublicため、別のパッケージのクラスから呼び出すと機能しません。

于 2012-05-30T07:17:07.130 に答える
1

Your class Nodedoes not compile, so it is likely that you should first fix that issue before continuing:

return T.toString();

does not make sense. Probably that just writing this:

return n.toString();

is enough for now.

于 2012-05-30T06:38:12.393 に答える