Дженерики CircularlinkedList

У меня возникла проблема с дженериками в CircularLinkedList. У меня есть класс CircularLinkedList, класс Node и класс Person. Узлы должны содержать людей, а CircularLinkedList должен содержать эти узлы. Проблема в том, что когда я пытаюсь создать свой 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;
    }

}

Тест.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
    }

}

person Thomas Teilmann    schedule 16.01.2012    source источник
comment
В какой строке возникает ошибка компилятора?   -  person millimoose    schedule 17.01.2012
comment
Где твой тестовый класс? Как правило, рекомендуется опубликовать код, который генерирует ошибку.   -  person Ted Hopp    schedule 17.01.2012
comment
да, я знаю, но у меня проблема с постом.. Я не могу заставить его показать тестовый класс. Прямо сейчас он отображается под блоком класса Person, что странно.   -  person Thomas Teilmann    schedule 17.01.2012
comment
Нет никаких причин для того, чтобы ограничение типа было E extends Comparable<? super E>CircularLinkedList не сравнивает свои элементы друг с другом. Просто сделайте подпись класса CircularLinkedList<E>; с дженериками меньше значит больше.   -  person millimoose    schedule 17.01.2012


Ответы (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, не должен ссылаться на Node; CircularLinkedList использует Node внутри, но пользователям этого класса не нужно беспокоиться об этом.

Кроме того, довольно странно, что ваш общий класс CircularLinkedList имеет метод с именем addPerson. Наверняка он должен называться addElement или просто add?

person ruakh    schedule 16.01.2012
comment
если я напишу это так: CircularLinkedList‹Person› list = CircularLinkedList‹Person›(); это дает мне ошибку в скобках. Синтаксическая ошибка в токене (выражение, ожидаемое после этого токена - person Thomas Teilmann; 17.01.2012
comment
@ThomasTeilmann: Это потому, что вам не хватает ключевого слова new. Вам нужно написать CircularLinkedList<Person> list = new CircularLinkedList<Person>();. - person ruakh; 17.01.2012
comment
Арг, Джебус. Спасибо, чувак, я программирую уже 11 часов подряд.. Я так устал.. Спасибо - person Thomas Teilmann; 17.01.2012
comment
Извините за беспокойство. Это была такая большая ошибка, на самом деле. - person Thomas Teilmann; 17.01.2012
comment
@ThomasTeilmann: Вы имеете в виду что-то другое, кроме того, что я упомянул в своем ответе? Нет, все остальное не так. Классы, которые вы разместили, выглядят нормально. - person ruakh; 17.01.2012

Ввод вашего кода в 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));
person millimoose    schedule 16.01.2012
comment
да, я знаю.. :) Это было просто что-то, что было включено в копипасту аналогичного тестового класса. Извините за путаницу. - person Thomas Teilmann; 17.01.2012
comment
@ThomasTeilmann Не могли бы вы опубликовать код, который действительно вызывает ошибку, о которой вы спрашиваете, публиковать как можно меньше указанного кода, а не публиковать совершенно не связанный тестовый код, а также указать, где возникает ошибка? - person millimoose; 17.01.2012