Javagenerics。 通用类型的数组

我最近开始学习JAVAgenerics。 一切都有意义,我现在明白了。 但有一件事让我感到困惑 – 你无法创建generics类型的数组。

我想实现抽象数据类型,例如队列和堆栈,但是使用一些generics类型作为存储在堆栈中的底层数据。 我该如何解决这个问题? 我确信我失踪了,但它是什么?

提前致谢。

Effective Java,第5章GENERICS,第25项:首选列表到数组

数组在两个重要方面与通用类型不同。 首先,数组是协变的。 这个可怕的单词意味着如果Sub是Super的子类型,那么数组类型Sub []是Super []的子类型。 相反,generics是不变的:对于任何两个不同类型Type1Type2List既不是子类型也不是List的超类型……

数组和generics之间的第二个主要区别是数组是有效的[JLS,4.7]。 这意味着数组在运行时知道并强制执行其元素类型。 如上所述,如果您尝试将String存储到Long数组中,您将获得ArrayStoreException。 相反,generics是通过擦除实现的[JLS,4.6]。 这意味着它们仅在编译时强制执行其类型约束,并在运行时丢弃(或擦除)其元素类型信息。 擦除允许generics类型与不使用generics的遗留代码自由互操作(第23项)。 由于这些基本差异,数组和generics不能很好地混合。 例如,创建generics类型,参数化类型或类型参数的数组是非法的。 这些数组创建表达式都不合法:new List [],new List [],new E []。 所有这些都会在编译时导致通用数组创建错误。

简而言之:arrays和generics具有某种“相反”特征,这使得在某些情况下即使不是不可能也很难将它们混合在一起,所以最好采用Joshua Bloch的话,并在涉及generics时使用列表而不是数组。

数组在Java中不是通用的。

另一方面,您已经拥有Stack,Queue,Set,Map和其他集合类型 – 只需检查java.util.*或对Java Collections Framework进行一些研究。