Я хочу создать массив классов, каждый из которых представляет тип, который доступен в системе, которую я создаю. Все связанные классы - это подклассы общего суперкласса. Поэтому я бы хотел:
Class<? extends SuperClass>[] availableTypes = { SubClass1.class, SubClass2.class };
Это дает мне ошибку:
Cannot create a generic array of Class<? extends SuperClass>.
Я получаю одно и то же сообщение, если попытаюсь квалифицировать создание массива в правой части инициализации:
Class<? extends SuperClass>[] availableTypes = Class<? extends SuperClass>[] { SubClass1.class, SubClass2.class };
Я могу получить код для компиляции, если я исключил квалификацию генериков:
Class[] availableTypes = { SubClass1.class, SubClass2.class };
Но затем я получаю предупреждение generics:
Класс является сырым типом. Ссылки на родовой тип Class должны быть параметризованы.
Я пытаюсь; Я пытаюсь!:) Кроме того, на данный момент, даже если это не вызвало предупреждения, я теряю часть интерфейса, который я пытался определить. Я не хочу просто возвращать массив произвольных классов; Я хочу вернуть массив классов, которые являются подклассами определенного SuperClass!
В Eclipse есть довольно мощные инструменты для определения того, какие параметры следует использовать для исправления объявлений дженериков, но в этом случае он падает, как это имеет место, когда вы имеете дело с классом. Предлагаемая им процедура "Внутренний тип аргументов" не изменяет код вообще, оставляя предупреждение.
Мне удалось обойти это, используя вместо этого Collection:
List<Class<? extends SuperClass>> availableTypes = new List<Class<? extends SuperClass>>();
Но какой правильный способ сделать это с помощью массивов?