我正在学习数据结构类(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/

10-12 05:50