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

时间:2015-01-13 21:06:13

标签: java 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);
    }
}

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

2 个答案:

答案 0 :(得分:5)

您使用Node开始;特别是,你可以使它包含任何类型的数据。

你这样做:

  • 在班级

    中引入泛型类型参数
    public class Node<T> { }
    
  • 只要您Object,请将其替换为T

    T data;
    
  • 请务必更新对其他Node实例的引用,以便它们使用相同的通用参数。

    Node<T> next;
    

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

  • 在班级

    中引入泛型类型参数
    public class LinkedList<T> { }
    
  • add的参数从Object更改为T

    public void add(T data) { }
    
  • 将泛型添加到Node个实例,以便您不使用原始类型。

    private Node<T> head;
    

答案 1 :(得分:1)

您应该考虑通过Generics tutorial。具体来说,请阅读“通用类型”部分。

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

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

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