我正在为我的编程课设置一个问题。问题集以:
开头给定链表类的以下定义:
1 public class Node<T> {
2 public T data;
3 public Node<T> next;
4 public Node(T data, Node<T> next) {
5 this.data = data; this.next = next;
6 }
7 }
8
9 public class LinkedList<T> {
10 private Node<T> front;
11 ...
12 }
现在,我无法弄清楚“Node&lt; T&gt;”是什么意思是(第1行)......我发现了一些关于通配符的文献(I.E. List),但这对我来说仍然没有多大意义。我想知道是否有人能解释为什么使用通配符(特别是在这种情况下),或者,如果这不是通配符的例子,我想知道是否有人可以告诉我它是什么?我所拥有的那本书(“Data Structures Outside In:Java”)没有提到任何有用的东西,oracle教程网站也没有提到(链接如下,如果有人想看到oracle必须说的话)
(我在这个网站上:http://download.oracle.com/javase/tutorial/extra/generics/wildcards.html 但是我仍然无法理解通用卡的用途,并弄清楚这是否是一个通配符的例子)
谢谢你的帮助!
答案 0 :(得分:3)
首先,Node表示链表的节点。使用单链表,每个节点都包含一个值和对列表中下一个节点的引用。
然后,泛型(T
是泛型类型,而不是通配符)定义每个Node的值类型必须与为List
定义的类型相同。
我建议阅读java generics
答案 1 :(得分:2)
java中泛型的强大功能 - 您现在可以通过这种方式使用此链接列表:
LinkedList<Pizza> pizzaList = new LinkedList<Pizza>();
// ...
Node<Pizza> p = pizzaList.front;
while (p != null) {
eat(p.data);
p = p.next;
}
基本上,泛型会为你进行投射,否则你可能会在代码中写(Pizza)p.data
。
答案 2 :(得分:1)
通配符,技术上的泛型,可以是任何对象。 T可以是String,Comparable,JList。优点是列表中的所有内容都是相同的类型,因此出来的所有内容都是相同的。
例如,我可以创建一个Node,当我访问Node.data时,它将是一个String形式,这意味着我不需要强制转换:String data = (String)node.data;
答案 3 :(得分:1)
回答问题的通配符......
通配符是泛型类型的约束。通配符有三种类型:
<?>
<? extends T> or <? extends IRunnable>
<? super T>
通配符限制了可以进入类或泛型中的特定方法的内容。 <?>
表示可以在泛型类中或在定义此约束的任何位置使用任何对象。 <? extends T>
表示进入泛型的类必须从T继承或实现接口T. <? extends IRunnable>
意味着进入泛型的类必须在其层次结构中的某个点实现IRunnable接口。最后,<? super T>
意味着泛型的传入类必须是超类型的T(即T层次结构中的父类)。