java - 循环链表泛型

标签 java generics generic-list circular-list

我在 CircularLinkedList 中遇到泛型问题。我有 CircularLinkedList 类、Node 类和 Person 类。 节点应包含人员,而 CircularLinkedList 应包含这些节点。问题是,当我尝试在测试类中创建 CircularLinkedList 时,我收到一条错误消息:

Bound mismatch: The type Node<Person> is not a valid substitute for the bounded parameter <E extends Comparable<? super E>> of the type 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
    }

}

最佳答案

听起来你正在写

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的代码不应该引用NodeCircularLinkedList 在内部使用 Node,但该类的用户无需担心这一点。

此外,通用 CircularLinkedList 类有一个名为 addPerson 的方法,这有点奇怪。当然它应该被称为 addElement,或者只是 add

关于java - 循环链表泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8886833/

相关文章:

java - 使用泛型类作为 java List 的类型

java - Java剪辑不起作用

java - 平均一个方法的多个结果?

java - 错误: Cannot create PoolableConnectionFactory (isValid() returned false)

Java泛型通配符问题: List<?扩展了A>

java - 泛型和继承极端情况

c# - C# List<T> 的线程安全给读者

java - 如何在 Java 中打印二维数组中的最大值路径?

java - 测试通用 Java 方法时出错

c# - 将关系数据集转换为 List<T>