#java #массивы #коллекции #generics
Предыстория: пишу свою реализацию коллекции на основе массива (задание такое). И дошел до метода toArray(). Есть классический массив: private E[] array; как его проинициализировать так что бы когда я возвращаю этот массив он был не Object а именно того типа который поступил на вход в класс. Такой вариант при возвращении все равно возвращает Object[] array =(E[]) new Object[length] Просмотрел уже несколько лекций по дженерикам в джаве и основная суть ясна, но нигде не говорят о типизированных массивах.
Ответы
Ответ 1
Тут есть подробное описание проблемы на английском языке. Вроде должно сработать как-то так: publicE[] 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[] является вполне валидной.
Комментариев нет:
Отправить комментарий