Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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_Arrays_Generics_Adt - Fatal编程技术网

Java泛型。泛型类型的数组

Java泛型。泛型类型的数组,java,arrays,generics,adt,Java,Arrays,Generics,Adt,我最近开始学习JAVA泛型。 一切都有道理,我现在有点明白了。 但有一件事让我感到困惑——您不能创建泛型类型的数组 我想实现抽象数据类型,比如队列和堆栈,但是使用一些泛型类型作为存储在堆栈中的底层数据。我怎样才能避开这个问题呢?我肯定我错过了,但那是什么 提前感谢。数组在Java中不能是通用的 另一方面,您已经有了堆栈、队列、集合、映射和其他集合类型—只需检查java.util.*或对java集合框架进行一些研究。有效java,第5章泛型,第25项:首选列表而非数组: 数组在两个重要方面不同于泛

我最近开始学习JAVA泛型。 一切都有道理,我现在有点明白了。 但有一件事让我感到困惑——您不能创建泛型类型的数组

我想实现抽象数据类型,比如队列和堆栈,但是使用一些泛型类型作为存储在堆栈中的底层数据。我怎样才能避开这个问题呢?我肯定我错过了,但那是什么


提前感谢。

数组在Java中不能是通用的


另一方面,您已经有了堆栈、队列、集合、映射和其他集合类型—只需检查
java.util.*
或对java集合框架进行一些研究。

有效java,第5章泛型,第25项:首选列表而非数组

数组在两个重要方面不同于泛型类型。首先是数组 它们是协变的。这个听起来吓人的词的意思很简单,如果Sub是一个 Super的子类型,则数组类型Sub[]是Super[]的子类型。 相比之下,泛型是不变的:对于任何两种不同的类型
Type1
Type2
List
既不是
列表

数组和 泛型是指数组被具体化[JLS,4.7]。这意味着 了解并在运行时强制执行它们的元素类型。如上所述,如果 如果尝试将字符串存储到Long数组中,则会得到 ArrayStoreException。相反,泛型是通过擦除实现的 [JLS,4.6]。这意味着它们仅强制其类型约束 在编译时丢弃(或擦除)它们的元素类型信息 在运行时。擦除允许泛型类型进行互操作 自由使用不使用泛型的遗留代码(第23项)。因为 在这些基本差异中,数组和泛型不能很好地混合。 例如,创建泛型类型的数组是非法的 参数化类型或类型参数。所有这些都不能用于创建数组 表达式是合法的:新列表[]、新列表[]、新E[]。全部的 将在编译时导致泛型数组创建错误


长话短说:数组和泛型具有某种“相反”的特性,这使得在某些情况下很难(如果不是不可能的话)将它们混合在一起,所以最好听Joshua Bloch的话,在涉及泛型时使用列表而不是数组。

我知道有一个库,但我想自己尝试实现这些类。只是为了了解这些ADT是如何工作的。数组可以是泛型的:它们只是不同于其他泛型类型。不是泛型数组,而是将对象数组转换为泛型类型的泛型类。这不是泛型。而且也很危险。在你的帖子里甚至有解释。