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