Java泛型。通用类型的数组

时间:2014-02-09 20:51:39

标签: java arrays generics adt

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

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

提前致谢。

2 个答案:

答案 0 :(得分:4)

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

  

阵列在两个重要方面与通用类型不同。首先是数组   是协变的。这个可怕的单词意味着如果Sub是a   Super的子类型,则数组类型Sub []是Super []的子类型。   相反,泛型是不变的:对于任何两种不同的类型Type1   而Type2List<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 进行一些研究。