通用节点和对象节点有什么区别

时间:2019-03-10 13:45:34

标签: java oop generics linked-list

这是我的linkedList类的内部Node类。

    private class Node{
    private Node next;
    private T value;

    public Node (T value,Node next){
      this.next=next;
      this.value=value;
    }
}

我要这样更改它。

    private class Node<T>{
    private Node <T> next;
    private T value;

    public Node (T value,Node<T> next){
      this.next=next;
      this.value=value;
    }
}

会发生什么,应该使用哪一个?我认为Node始终是一个对象,因此我们不必将其与通用数据类型一起使用。我错过了任何一点吗?

1 个答案:

答案 0 :(得分:0)

从您的问题中我了解到您的代码看起来像这样

public class LinkedList<T> {
    .
    .
    .

    public class Node{
        .
        .
        .
        }
    }

那你应该去

private class Node{
    private Node next;
    private T value;

    public Node (T value,Node next){
        this.next=next;
        this.value=value;
    }
}

,而不是另一个。原因是当您使用上述版本时,两个类中的T都引用了对象定义中提供的type参数,即

LinkedList<String> list; // here String is the type argument for both LinkedList and Node

,您只需通过

创建Node对象。

Node someNode=...

因此,在编译时,编译器将确保仅将String值存储在所需的Node.value中。

如果您改为使用另一种方法,即Node<T>,则每当创建类型为Node的对象时,您都将不得不通过编码再次键入

Node<T> someNode = new .. // notice the additional type arguments

这会使您的代码混乱,并超出了泛型的主要目标。