Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通用堆栈(破解代码访问)_Java_Class_Stack_Generic Programming - Fatal编程技术网

Java 通用堆栈(破解代码访问)

Java 通用堆栈(破解代码访问),java,class,stack,generic-programming,Java,Class,Stack,Generic Programming,在“破解编码”访谈中,我在理解堆栈类的实现时遇到了一些问题(对于那些有这本书的人来说,这是第3章“堆栈和队列”的第一页) 代码如下所示: public class MyStack<T>{ private static class StackNode<T>{ private T data; private StackNode<T> next; public StackNode(T data){ thid.data = da

在“破解编码”访谈中,我在理解堆栈类的实现时遇到了一些问题(对于那些有这本书的人来说,这是第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
}
对我来说,
MyStack
意味着我正在创建一个由另一个对象
T
构成的对象
MyStack
,这没有任何意义。如果堆栈由节点组成,那么我的类型
T
应该是
StackNode
(?)类型。但是,当我定义
Stacknode
时,它就像说
Stacknode
。我想我对泛型类型造成了很大的混淆,但重点是我不明白为什么像我在代码中那样做是不够的:不管它是什么类型的堆栈,它都是由节点组成的,当然可以有泛型数据,所以我刚才说我节点的数据是
Object
类型的,有人能解释一下主要的区别吗,或者至少解释一下为什么“破解编码面试”是这样做的?有什么好处?我理解错了什么? 提前谢谢你

此处的
的目的是指定要存储在堆栈中的元素的类型。这里
T
是一种模板,在声明时可以用任何类型替换

例如,如果希望创建字符串堆栈,可以将其声明为

Stack<String> myStack;
Stack myStack;

这将确保内部类
节点
也将
字符串
用作
数据
的数据类型。您只需在声明堆栈期间指定类型,就可以了。这样,当您需要一个
Integer
s的堆栈时,您就不必再编写
Stack
类了。

如果您使用对象而不是泛型,那么您就没有类型安全性,因为您总是必须强制转换取出的对象。在泛型示例中,
t
数据的类型,不是节点本身。反问:那么什么时候使用泛型参数?正如@csmckelvey指出的:泛型参数在编译时为您提供(某种)类型安全性。这意味着使用并不意味着我的堆栈是由T(对象T)组成的?例如,当我们初始化向量时,我们使用向量向量,其中字符串是向量中包含的类型,所以我的向量将由字符串组成。在本例中,MyStack由节点组成,但节点包含T。那么,我们什么时候思考一种方式,什么时候思考另一种方式?@GruppoAsek当你看一看,你会发现他们使用了相同的概念。对于
ArrayList
,您已经拥有了数组形式的底层数据结构。但是,对于
链接列表
,仍然需要数据结构,即链接节点。这就是为什么您使用内部类
节点
,它包装每个值。当您声明
堆栈myStack
时,它将自动确保
节点
s将包含
字符串
s。要获得它,请替换类
堆栈中的所有
T
s,并移除
s,然后查看它是如何运行的。
向量
不是“由字符串组成的”。它是一个包含字符串的结构。而
堆栈
将是包含字符串的堆栈。@GruppoAsek在这个实现中,
堆栈
是节点的链接列表。每个节点都包含一个
T
类型的元素。是的,你可以这样想:这就像指定元素的数据类型作为参数,这样我们就可以使用相同的代码来创建任何类型的元素堆栈。
Stack<String> myStack;