Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/25: Рейтинг темы: голосов - 25, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 02.09.2016
Сообщений: 22

Создание массива объектов класса, вложенного в обобщённый класс

07.09.2016, 18:12. Показов 4637. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здавствуйте, проясните пожалуйста ситуацию. Внутри обобщённого класса я создал внутренний класс и пытаюсь создать массив объектов этого внутреннего класса. Компилятор не даёт это сделать. Я знаю, что создавать массивы обобщений во время выполнения программы нужно с помощью отражения, но ведь в этом внутреннем классе я не использовал параметр тип. Сделать внутренний класс статическим я не могу, так как понадобится доступ к нестатическим полям внешнего класса. Придётся создавать массив с помощью отражения, но всё-таки хотелось бы понять почему ругается компилятор?

Java
1
2
3
4
5
public class A<T> {
   class B {
      B[] arr = new B[10];
   }
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.09.2016, 18:12
Ответы с готовыми решениями:

Как сделать так, чтобы был доступ к методу вложенного класса, если объявлен только внешний класс
То есть если в классе Class есть вложенный класс innerClass с методом method() была возможна такая вещь: Class class = new Class(); ...

Определить класс Rectangle и класс Point. Объявить массив из n объектов класса Point. Написать функцию, определяющ
Определить класс Rectangle и класс Point. Объявить массив из n объектов класса Point. Написать функцию, определяющую, какая из точек...

Создание объектов класса
Столкнулся с таким ньюансом... Можно ли создать много объектов класса не объявляя каждый отдельной строкой в исходнике? class Book {...

3
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
08.09.2016, 16:32
Лучший ответ Сообщение было отмечено Sergey0088 как решение

Решение

Цитата Сообщение от Sergey0088 Посмотреть сообщение
почему ругается компилятор?
Потому, что ваш внутренний класс B получил свойство быть дженериком от внешнего, ибо не описан как статический. А массив дженериков создать нельзя потому что в рантайме тип T неизвестен из-за того, что в джаве дженерики сделаны со стиранием типа. Я вижу три решения:
1) использовать raw-тип, коим в данном случае является внешний класс:
Java
1
2
@SuppressWarnings("unchecked")
B[] arr = (B[]) new A.B[10];
2) использовать подстановочный тип:
Java
1
2
@SuppressWarnings("unchecked")
B[] arr = (B[]) new A<?>.B[10];
3) использовать строгую проверку типизации в рантайме:
Java
1
2
3
4
5
6
7
8
9
10
11
public class A<T> {
    class B {
        private B[] arr;
       
        @SuppressWarnings("unchecked")
        public B(Class<T> c, int N)
        {
            arr = (B[]) Array.newInstance(c, N);
        }
    }
}
2
0 / 0 / 0
Регистрация: 02.09.2016
Сообщений: 22
08.09.2016, 19:11  [ТС]
Спасибо большое, про то, что внутренний класс автоматически дженерализируется не знал. У Эккеля, как раз про создание массивов обобобщённого типа написано, что нужно использовать отражения, я так и делал. Но, почему же тогда запись:
Java
1
B b = new B()
Не вызывает у компилятора нареканий. Ведь если класс автоматически становится дженериком, это должно стать не возможным, как и в случае с массивом
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
08.09.2016, 22:27
Цитата Сообщение от Sergey0088 Посмотреть сообщение
Не вызывает у компилятора нареканий
А ошибок в рантайме не будет?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.09.2016, 22:27
Помогаю со студенческими работами здесь

Как при создании экземпляра класса инициализировать переменные вложенного класса
Здравствуйте. Подскажите пожалуйста как при создании екземпляра класа инициализировать переменные вложеного класа. Добавлено через 22...

Как вызвать метод вложенного класса в методе родительского класса
Имеется родительский класс для прорисовки графики Jogj package objects; import com.jogamp.opengl.GL2; import...

Как из вложенного класса сослаться на объект внешнего класса?
Привет всем! пытаюсь разобраться с событиями. Хочу при клике изменить цвет кнопки на другой, не не могу из внутреннего класса получить...

Создание объектов класса и обращение к нему
Такой вопрос. У меня есть класс &quot;Casern&quot; , который наследуется от абстрактного класса &quot;Buildings&quot; и у которого есть метод...

Java. Классы. Создание объектов класса в цикле
Здравствуйте! У меня есть класс Team. И класс Tournament, одно из полей которого является массивом объектов типа Тeam. Пытаюсь создавать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru