我最近开始学习JAVA泛型。 一切都有意义,我现在明白了。 但有一件事让我感到困惑 - 你无法创建泛型类型的数组。
我想实现抽象数据类型,例如队列和堆栈,但是使用一些泛型类型作为存储在堆栈中的底层数据。我该如何解决这个问题?我相信我失踪了,但它是什么?
提前致谢。
答案 0 :(得分:4)
有效的Java,第5章GENERICS,第25项:首选列表到数组:
阵列在两个重要方面与通用类型不同。首先是数组 是协变的。这个可怕的单词意味着如果Sub是a Super的子类型,则数组类型Sub []是Super []的子类型。 相反,泛型是不变的:对于任何两种不同的类型
Type1
而Type2
,List<Type1>
既不是子类型也不是超类型List<Type2>
...数组和数组之间的第二个主要区别 泛型是数组被统一[JLS,4.7]。这意味着数组 在运行时知道并强制执行其元素类型。如上所述,如果 你试图将一个String存储到一个Long数组中,你会得到一个 ArrayStoreException信息。相反,泛型是通过擦除实现的 [JLS,4.6]。这意味着它们仅强制执行类型约束 在编译时并丢弃(或擦除)它们的元素类型信息 在运行时。擦除是允许泛型类型互操作的原因 自由使用不使用泛型的遗留代码(第23项)。因为 在这些基本差异中,数组和泛型不能很好地混合。 例如,创建泛型类型的数组是非法的 参数化类型或类型参数。这些数组都没有创建 表达式是合法的:new List [],new List [],new E []。所有 将在编译时导致通用数组创建错误。
长话短说:阵列和泛型具有某种“相反”的特征,这使得在某些情况下很难(如果不是不可能)混合它们,所以最好采用Joshua Bloch的话,并在泛型时使用列表而不是数组涉及。
答案 1 :(得分:-3)
数组中的数组不能是通用的。
另一方面,您已经拥有Stack,Queue,Set,Map和其他集合类型 - 只需检查java.util.*
或对 Java Collections Framework 进行一些研究。