Страницы

Поиск по вопросам

понедельник, 24 февраля 2020 г.

Как создать типизированный массив объектов?

#java #массивы #коллекции #generics


Предыстория: пишу свою реализацию коллекции на основе массива (задание такое). И
дошел до метода toArray().

Есть классический массив:

private E[] array;

как его проинициализировать так что бы когда я возвращаю этот массив он был не Object
а именно того типа который поступил на вход в класс.

Такой вариант при возвращении все равно возвращает Object[] 

array =(E[]) new Object[length]

Просмотрел уже несколько лекций по дженерикам в джаве и основная суть ясна, но нигде
не говорят о типизированных массивах.
    


Ответы

Ответ 1



Тут есть подробное описание проблемы на английском языке. Вроде должно сработать как-то так: public E[] getArray(Class clazz, int size) { @SuppressWarnings("unchecked") E[] arr = (E[]) Array.newInstance(clazz, size); return arr; }

Ответ 2



При инициализации массива в Java вы изначально объявляете его тип. В памяти хранятся объекты именно этого типа, и присвоить внутрь него объекты другого типа, никак не получится. Скорее всего ваша проблема в том, что в каком то месте вы преобразовываете тип вашего массива в массив типа Object. Убедитесь что вы верно указали все типы переменных, а так же типы всех возвращаемых значение функций. Вот простой пример generic класса, работающего с массивом: public class MyStructure{ private T[] array; public MyStructure(T[] array) { this.array = array; } public T[] getArray() { return array; } } Обратите внимание, на то что у функции getArray() указан тип T[].

Ответ 3



Информация о generic'a в java не доступна после компиляции. Все типы стираются и превращаются в Object, а type safe обеспечивается явным кастованием. Приведу пример. У нас есть метод: final T field; private T get() { return field; } После компиляции информация о типах сотрется и будет следующее: final Object field; private Object get() { return field; } А там, где вызывался метод будет следующее: GenericClassobj=new GenericClass<>(); String field= (String) obj.get() Соответственно, конструкция вида (T[])new Object[] является вполне валидной.

Комментариев нет:

Отправить комментарий