1

CircularLinkedListのジェネリックスで問題が発生しています。CircularLinkedListクラス、Nodeクラス、Personクラスがあります。ノードには人物が含まれている必要があり、CircularLinkedListにはそれらのノードが含まれている必要があります。問題は、TestクラスでCircularLinkedListを作成しようとすると、次のようなエラーが発生することです。

バインドされた不一致:タイプは、タイプ Node<Person>の制限されたパラメーターの有効な代替ではありません<E extends Comparable<? super E>>CircularLinkedList<E>

私のジェネリックを見ていただけますか?

CircularLinkedList.java

 package cirkulærliste;

    import java.util.Random;

    public class CircularLinkedList<E extends Comparable<? super E>> {

        private Node<E> next;
        private Node<E> start;
        private int size = 0;

        public CircularLinkedList() {
            setNext(null);
        }

        /**
         * tilføjer personer
         * @param p
         */
        public void addPerson(E e) {
            Node<E> newNode = new Node<E>(e, null);
            Node<E> tempNext = next;

            if(next == null){
                next = newNode;
                next.setNext(next);
            } else if(size > 1){

            }
        }

        /**
         * udskriver personerne i den rækkefølge de står i listen
         */
        public void print() {
            Node<E> tempNode = start;
            while (!tempNode.getNext().equals(start)) {
                System.out.println(tempNode);
                tempNode = tempNode.getNext();
            }
            System.out.println(tempNode);
        }

        /**
         * en tilfældig person i den cirkulæreliste vælges som start i listen
         */
        public void randomStart() {
            int size = 1;
            Node<E> tempNode = next.getNext();
            while (!tempNode.getNext().equals(next.getNext())) {
                tempNode = tempNode.getNext();
                size++;
            }
            Random randomizer = new Random();
            int chosen = randomizer.nextInt(size);
            for (int i = 0; i <= chosen; i++) {
                tempNode = tempNode.getNext();
            }
            start = tempNode;
        }

        /**
         * fjerner den person fra listen der ligger count pladser fra start i listen. Personen der fjernes returneres.
         * @param count
         */
        public Node<E> remove(int count) {
            Node<E> tempNode2;
            for (int i = 1; i < 5; i++) {
                next = next.getNext();
            }
            tempNode2 = next.getNext();
            next.setNext(next.getNext().getNext());
            tempNode2.setNext(null);
            return tempNode2; 
        }


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


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


        public void setStart(Node<E> start) {
            this.start = start;
        }


        public Node<E> getStart() {
            return start;
        }
    }

Node.java

package cirkulærliste;

public class Node<E> {

    private E element;
    private Node<E> next;

    public Node(){
        element = null;
        next = null;
    }

    public Node(E element, Node<E> next){
        this.setElement(element);
        this.next = next;
    }

    public E getElement() {
        return element;
    }

    public void setElement(E element) {
        this.element = element;
    }

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

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

    public String toString(){
        return "" + element;
    }

}

Person.java

package cirkulærliste;

public class Person implements Comparable<Person> {

    private String name;
    private int number;

    public Person(String name, int number){
        this.setName(name);
        this.setNumber(number);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String toString(){
        return "Name: " + name + "  -  " + "Number: " + number;
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    @Override
    public int compareTo(Person o) {
        // TODO Auto-generated method stub
        return 0;
    }

}

Test.java

public class Test {

    public static void main(String[] args) {
        CircularLinkedList<Person> list = new CircularLinkedList<Person>();

        Node<Person> n1 = new Node<Person>();
        n1.setElement(new Person("Thomas", 1));
        list.addPerson(n1); // Compile error occurs here
    }

}
4

2 に答える 2

2

あなたが書いているように聞こえます

CircularLinkedList<Node<Person>>

テストクラスで; しかし、あなたは実際に書く必要があります

CircularLinkedList<Person>

更新された質問の更新:これも変更する必要があります:

Node<Person> n1 = new Node<Person>();
n1.setElement(new Person("Thomas", 1));
list.addPerson(n1); // Compile error occurs here

これに:

list.addPerson(new Person("Thomas", 1));

一般に、を使用するコードは;CircularLinkedListを参照しないでください。内部で使用しますが、クラスのユーザーはそれについて心配する必要はありません。NodeCircularLinkedListNode

また、ジェネリックCircularLinkedListクラスに。という名前のメソッドがあるのはちょっと奇妙ですaddPerson。確かにそれは呼ばれるべきですかaddElement、それとも単にadd

于 2012-01-16T22:02:18.580 に答える
0

コードをIDEに入れると、ここでエラーが発生します。

Node<Person> n1 = new Node<Person>();
n1.setElement(new Person("Thomas", 1));
list.addPerson(n1);

addPerson(E e)タイプのコレクションのメソッドは、パラメーターとしてインスタンスをCircularLinkedList<Person>想定しています。Personの実装でも(必要に応じて)addPerson新しいインスタンスが作成されるため、コードを呼び出すときにそれを行う必要はありません。Node

これはうまくコンパイルされます:

list.addPerson(new Person("Thomas", 1));
于 2012-01-16T22:21:10.203 に答える