繁体   English   中英

链接列表泛型java

[英]Linked list Generics java

所以我刚开始学习java泛型,我的老师给了我们这段代码

public class LinkedList<T> {
    class Node<T>{
        T info;
        Node<T> next;
    }

    Node<T> head = new Node<T>();
/*
and here are supposed to be all the methods like add,remove... that use Class Node
*/

}

所以问题在于这一行

class Node<T>{

<T> Eclipse给我“类型参数T隐藏类型T”警告,所以我删除并使用

public class LinkedList<T> {
    class Node{
        T info;
        Node next;
    }

    Node head = new Node();
/*
and here are supposed to be all the methods like add,remove... that use Class Node
*/

}

我现在没有得到任何警告,但它让我想知道代码是否做同样的事情? 如果没有什么区别? 有人可以向我解释一下这个区别,还是指出了正确的方向? 非常感谢。

这与具有与成员变量同名的局部变量或与超类中具有相同名称的子类中的成员变量非常相同:执行此操作是合法的,只是混淆了哪个T你指的是。

您实际上不需要Node上的类型变量:

public class LinkedList<T> {
  class Node {}
}

因为NodeLinkedList<T>的内部类,所以它可以使用父类定义的T 这就是你想要的:列表的节点应该是与包含List相关的类型(例如,你不会在LinkedList<String>Node<Integer> )。

您可以使Node静态:

public class LinkedList<T> {
  static class Node<T> {}
}

除了泛型,这很好,因为这意味着你的每个Node实例都没有包含对LinkedList的引用 - 你几乎肯定不需要它。

现在它们是单独的类型变量。 但是要注意在这里,现在是哪个混乱T你的意思。 你可以通过调用其他类型的变量来更清楚 - 比方说, S 然后,您不能将LinkedList上的类型与Node上的类型混淆。

代码运行时实际上没有T 通用类型声明是Java 8时的编译时结构。实际代码将完全删除泛型类型声明,并在没有它的情况下运行。

至于你拥有的代码,当你使用泛型类型声明在类中声明内部非静态类时,该内部类将使用与其外部类相同的类型。 这就是为什么

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

据说是“隐藏通用型签名”。

由于外部类是Generic类,因此内部的所有内容都将依赖于该值,如果外部类已经是泛型类,则内部类不需要特定的泛型类

T被称为“有界类型参数”。 所以当你想限制可以在参数化类型中用作类型参数的类型时。 所以下面的类与参数绑定。

public class LinkedList<T> {
   class Node<T> {

              }
        }

由于Node类未声明为static,因此任何Node对象都具有对其中创建的LinkedList的隐式引用。 鉴于此,在外部类LinkedList声明的T类型参数也在Node类中使用。

例如,如果在LinkedList<String>的范围内创建Node ,则它将隐式地为Node<String>

另一方面,如果Node类被声明为static ,则必须将其声明为Node<T> (或任何其他符号而不是T ),因为您无法使用LinkedListT类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM