java - 数据结构(Weiss Java 书): Why allocate Comparable[] in BinaryHeap<T> array instead of T[]?

标签 java generics data-structures binary-heap

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

我了解 BinaryHeap 的结构,但我想快速了解泛型。类声明足够简单,确保 AnyType 扩展的类型是 Comparable 到 AnyType 或 AnyType 继承层次结构上的任何父类(super class)(以防 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/

相关文章:

java - 在 Spring Boot 中连接多个 "Dynamic"数据库以及本地 "Static"数据库

java - 如何删除文本并打印java文件中删除的文本行中的行?

java - jackson 资源访问异常 : I/O error: Unrecognized field

java - 将 ArrayList<String> 转换为字节 []

vb.net - 在通用 VB.NET 结构中,如何访问其显式提供的构造函数?

generics - Kotlin - 如何生成无法具体化的递归函数?

swift - 泛型的泛型? A<T<U>> 类?

java - 我可以简化这个 Java 泛型层次结构吗

php - 无需 foreach 循环即可声明性访问结构化 PHP 变量

haskell - 在 Haskell 中以通用方式扩充复杂数据类型