我正在学习数据结构类(class),我们正在使用 Mark Weiss 编写的 Java 2nd Edition 中的数据结构和算法分析。在他的 BinaryHeap 实现中,他的构造函数创建了一个 Comparable[] 数组,该数组被强制转换为 AnyType[]。你知道他为什么这样做而不是仅仅创建一个新的 AnyType[] 吗?
我了解 BinaryHeap 的结构,但我想跟上泛型的速度。类声明足够简单,确保 AnyType 扩展了一个与 AnyType 或 AnyType 继承层次结构上的任何父类(super class) Comparable 的类型(如果 AnyType 是一个类型的子类并且不需要更改它的 compareTo 方法来运行)。
但是, array = (AnyType[]) new Comparable[ capacity + 1 ];
行对我来说毫无意义。 AnyType 不是已经是 Comparable 了吗?只写 array = new AnyType[ capacity + 1 ];
有什么后果?
可以在 on his site 找到完整的类源,但这里是我关心的部分:
public class BinaryHeap<AnyType extends Comparable<? super AnyType>>
{
private int currentSize; // Number of elements in heap
private AnyType [ ] array; // The heap array
/**
* Construct the binary heap.
* @param capacity the capacity of the binary heap.
*/
public BinaryHeap( int capacity )
{
currentSize = 0;
array = (AnyType[]) new Comparable[ capacity + 1 ];
}
最佳答案
您不能创建泛型类型的数组,因为类型信息在运行时不存在。由于 AnyType
扩展了 Comparable
,这是唯一可以使用的“具体”类型。
对 AnyType[]
的强制转换只是为了确保在出现错误时给出编译时警告;在生成的字节码指令中将不存在该转换。类似地, array
类变量将是结果字节码中的 Comparable[]
。
关于java - 数据结构(Weiss Java 书籍) : Why allocate Comparable[] in BinaryHeap<T> array instead of T[]?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4249951/