Как исправить ошибку при инициализации массива элементов E в конструкторе? - PullRequest
0 голосов
/ 22 декабря 2018

Я работаю со структурами данных и не могу инициализировать массив общих элементов;

public class Heap <'E extends Comparable<E>'> { 

private E elements[];

public Heap(int n) {

    E[] es = (E[]) new Object[n];
    elements=es;

    }
}

public static void main(String[]args) {

        Heap<Integer>tree=new Heap<Integer>(10);
}

Когда я запускаю программу, я получаю эту ошибку:

Исключение впоток "основной" java.lang.ClassCastException: [Ljava.lang.Object;не может быть приведен к [Ljava.lang.Comparable;в heaptree.Heap. (Heap.java:16) в heaptree.Heap.main (Heap.java:70)

Может кто-нибудь предложить способ исправить это?

1 Ответ

0 голосов
/ 22 декабря 2018

Проблема

Вы не можете сделать это таким образом на Java, нет шансов.Потому что вам понадобится информация во время выполнения, доступная только во время компиляции.Вы просто не можете создать массив универсального типа.

Где бы вы ни создавали new Heap<Whatever>, только компилятор знает, что вы хотите Whatever для вашего универсального типа E.Внутри конструктора E вы пытаетесь создать массив, который можно использовать как E[], что означает Whatever[] в этом примере.В Java Whatever[] не является подклассом, например, Object[], хотя Whatever, конечно, является подклассом Object.Вы не можете использовать Whatever[] там, где ожидается Object[], и наоборот.

Таким образом, можно использовать только точный массив Whatever[], где ожидается массив Whatever[],оставляя вам необходимость знать во время выполнения, что на этот раз вы должны создать массив Whatever с.И информация <Whatever> стирается компилятором, недоступной во время выполнения.

Обходной путь / решение

Если вы посмотрите на источники, например ArrayList, вы увидите, чтоЭксперты сделали это по-другому, не пытаясь создать массив определенного типа, а постоянного общего типа Object.ArrayList только преобразует такие вещи, как возвращаемое значение метода get() в универсальный тип, а не внутренний массив.

Итак, создайте массив с фиксированным типом, который охватывает все возможные типы E, напримерComparable[] и методы типа get() приводят элемент массива к E перед его возвратом.

Или вы можете передать объект класса E в конструктор, например Heap(Class<E> targetClass, int n), так что выполучите его доступным во время выполнения и используйте Array.newInstance(targetClass, n) с этим объектом класса и требуемым измерением.

...