Проблема
Вы не можете сделать это таким образом на 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)
с этим объектом класса и требуемым измерением.