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

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

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


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

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

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

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

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

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

3
5988 / 2112 / 739
Регистрация: 10.12.2010
Сообщений: 5,932
Записей в блоге: 3
08.09.2016, 16:32 2
Лучший ответ Сообщение было отмечено 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  [ТС] 3
Спасибо большое, про то, что внутренний класс автоматически дженерализируется не знал. У Эккеля, как раз про создание массивов обобобщённого типа написано, что нужно использовать отражения, я так и делал. Но, почему же тогда запись:
Java
1
B b = new B()
Не вызывает у компилятора нареканий. Ведь если класс автоматически становится дженериком, это должно стать не возможным, как и в случае с массивом
0
5988 / 2112 / 739
Регистрация: 10.12.2010
Сообщений: 5,932
Записей в блоге: 3
08.09.2016, 22:27 4
Цитата Сообщение от Sergey0088 Посмотреть сообщение
Не вызывает у компилятора нареканий
А ошибок в рантайме не будет?
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.09.2016, 22:27

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.