4

我正在学习数据结构课程,我们正在使用 Mark Weiss 编写的 Java 2nd Edition 中的数据结构和算法分析。在他的 BinaryHeap 实现中,他的构造函数创建了一个转换为 AnyType[] 的 Comparable[] 数组。你知道他为什么这样做而不是仅仅创建一个新的 AnyType[] 吗?

我了解 BinaryHeap 的结构,但我想跟上泛型的速度。类声明很简单,确保 AnyType 扩展了与 AnyType 或 AnyType 继承层次结构上的任何超类可比较的类型(如果 AnyType 是类型的子类并且不需要更改其 compareTo 方法即可运行)。

但是,这行 ,array = (AnyType[]) new Comparable[ capacity + 1 ];对我来说毫无意义。AnyType 不是已经是 Comparable 了吗?仅仅写作有什么后果array = new AnyType[ capacity + 1 ];

完整的课程资源可以在他的网站上找到,但这里是我关心的部分:

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 ];
    }
4

3 回答 3

4

您不能创建泛型类型的数组,因为类型信息在运行时不存在。作为AnyTypeextends Comparable,这是唯一可以使用的“具体”类型。

转换AnyType[]为只是为了确保在出现错误时给出编译时警告;生成的字节码指令中不存在该强制转换。同样,array类变量将是Comparable[]生成的字节码中的 a。

于 2010-11-22T20:39:57.080 回答
2

Java 使用类型擦除来实现泛型,因此在运行时类型 AnyType 是未知的,因此您无法创建它们的数组。看看这个其他问题

于 2010-11-22T20:39:03.353 回答
1

由于泛型类型擦除,编译器不知道是什么AnyType(因此无法创建它的数组)。但是我们知道AnyTypeimplements Comparable,所以创建一个 Comparables 数组是一个安全的解决方案。

于 2010-11-22T20:41:43.737 回答