在“破解编码”采访中,我在理解Stack类的实现时遇到了一些问题(对于那些拥有本书的人来说,这是第3章“堆栈和队列”的第一页)。
代码如下:
public class MyStack<T>{
private static class StackNode<T>{
private T data;
private StackNode<T> next;
public StackNode(T data){
thid.data = data;
}
}
private StackNode<T> top;
// and so on
}
问题是我真的不明白为什么我应该对T
使用通用类型MyStack
,而对Stacknode
使用通用类型。堆栈是节点的“队列”,由值组成。
当我第一次尝试自己做到这一点时,我做了一些更像是的事情:
class Stack{
private static class Node{
private Object data;
private Node next;
public Node(Object data){
this.data = data;
}
}
private Node top;
public Stack(){
top = null;
}
public Stack(Node top){
this.top = top;
top.next = null;
}
//and so on
}
对我来说,MyStack<T>
意味着我正在创建由另一个对象MyStack
组成的对象T
,这没有任何意义。如果堆栈由节点组成,则我的类型T
应该是类型StackNode
(???)。但是,当我定义Stacknode<T>
时,就像是说Stacknode<Stacknode>
。我认为我对泛型类型非常困惑,但要点是我不明白为什么这样做不像我在代码中所做的那样足够:无论哪种堆栈,它都是由节点组成的,然后当然可以拥有通用数据,所以我刚刚说过我的Node的数据类型为Object
,有人可以解释主要区别吗,或者至少为什么在“破解编码面试”中这样做?有什么优势?我理解错了什么?
预先谢谢你!
答案 0 :(得分:0)
这里 $matches = preg_split('/\s*(\d*)/', $lines[$i]);
的目的是为要存储在堆栈中的元素指定一种类型。 <T>
是一种模板,可以在声明时替换为任何类型。
例如,如果您希望创建一堆字符串,则可以将其声明为
T
这将确保内部类Stack<String> myStack;
也将Node
用作String
的数据类型。您只需要在声明堆栈时指定类型,就可以了。这样,当您需要一堆data
时就不必再次编写Stack
类。