如何使我的自定义链表使用泛型?

How to make my custom linked list to use generics?

我需要使用泛型实现自定义链表。

这是我所做的

public class Node {
    Node next;
    Object data;

    public Node(Object data) {
        next = null;
        this.data = data;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object dataValue) {
        data = dataValue;
    }

    public Node getNext() {
        return next;
    }

    public void setNext(Node nextValue) {
        next = nextValue;
    }
}


public class LinkedList {

    private Node head;
    private int size;

    public LinkedList() {
        head = new Node(null);
        size = 0;
    }

    public void add(Object data) {
        Node node = new Node(data);
        Node current = head;
        while (current.getNext() != null) {
            current = current.getNext();
        }
        current.setNext(node);
        size++;
    }

    public int getSize() {
        return size;
    }

    public String toString() {
        Node current = head.getNext();
        String elements = "";
        while (current != null) {
            elements += "[" + current.getData().toString() + "]";
            current = current.getNext();
        }
        return elements;
    }
}

public class Main {

    public static void main(String[] args) {
        System.out.println("Hello there!");
        LinkedList list = new LinkedList();

        list.add("First node");
        list.add("Second node");
        list.add("Third node");
        list.add("Fourth node");
        list.add("Fifth node");

        System.out.println("Linked list contains " + list.getSize() + " nodes");
        System.out.println("Here they are: " + list);
    }
}

我不知道或者只是不太明白我应该在哪里使用泛型以及如何使用?有什么想法吗?

开始 Node class;具体来说,你让它可以包含任何类型的数据。

你这样做是这样的:

  • 在class级别引入泛型类型参数

    public class Node<T> { }
    
  • 无论哪里有 Object,请将其替换为 T

    T data;
    
  • 确保更新对内部其他 Node 实例的引用,以便它们使用相同的通用参数。

    Node<T> next;
    

现在,您可以用类似的方式解决 LinkedList class 中的问题。

  • 在class级别引入泛型类型参数

    public class LinkedList<T> { }
    
  • add 的参数从 Object 更改为 T

    public void add(T data) { }
    
  • 将泛型添加到您的 Node 个实例中,这样您就不会使用原始类型。

    private Node<T> head;
    

您应该考虑通过 Generics tutorial。具体来说,通读 'Generic Types' 部分。

基本上,您的 LinkedList 和 Node 实现需要通用,只需将它们声明为 LinkedList<T>Node<T>。一旦你将 类 更改为通用的,你就可以实例化一个参数化的 LinkedList,例如:

LinkedList<String> stringList = new LinkedList<>();

LinkedList 现在是类型安全的,只允许存储字符串。