Структуры данных (книга Вайса о Java): зачем выделять Comparable [] в массиве BinaryHeap <T>вместо T []? - PullRequest
4 голосов
/ 22 ноября 2010

Я беру курс по структурам данных, и мы используем анализ структур данных и алгоритмов в Java 2nd Edition от Марка Вайса. В его реализации BinaryHeap его конструктор создает массив Comparable [], который приводится к AnyType []. У вас есть идея, почему он делает это вместо того, чтобы просто создать новый AnyType []?

Я понимаю структуру BinaryHeap, но я хочу быть в курсе дженериков. Объявление класса достаточно простое, убедитесь, что AnyType расширяет тип, который сопоставим с AnyType или любым суперклассом, до иерархии наследования AnyType (в случае, если AnyType является подклассом типа и ему не требуется изменять свой метод CompareTo для функционирования ).

Однако, строка, array = (AnyType[]) new Comparable[ capacity + 1 ];, не имеет смысла для меня. Разве AnyType уже не является сопоставимым? Какие последствия есть только для написания 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 ];
    }

Ответы [ 3 ]

4 голосов
/ 22 ноября 2010

Вы не можете создавать массивы универсального типа, потому что информация о типе не существует во время выполнения.Поскольку AnyType расширяет Comparable, это единственный «конкретный» тип, который можно использовать.

Приведение к AnyType[] просто для того, чтобы обеспечить выдачу предупреждений во время компиляции в случае ошибки;это приведение не будет существовать в результирующих инструкциях байт-кода.Аналогично, переменная класса array будет иметь значение Comparable[] в результирующем байт-коде.

2 голосов
/ 22 ноября 2010

Java использует Тип Erasure для реализации Generics, поэтому во время выполнения тип AnyType неизвестен, и поэтому вы не можете создать их массив.Посмотрите на этот другой вопрос .

1 голос
/ 22 ноября 2010

Из-за стирания универсального типа компилятор понятия не имеет, что такое AnyType (и, следовательно, не может создать его массив). Но мы знаем, что AnyType реализует Comparable, поэтому создание массива Comparables является безопасным решением.

...