有人可以向我解释基本的Java泛型吗?

时间:2011-06-09 21:43:09

标签: java generics

我正在为我的编程课设置一个问题。问题集以:

开头

给定链表类的以下定义:

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 但是我仍然无法理解通用卡的用途,并弄清楚这是否是一个通配符的例子

谢谢你的帮助!

4 个答案:

答案 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层次结构中的父类)。