Я хочу создать массив Классов, каждый из которых представляет тип, который доступен в системе, которую я строю. Все задействованные классы являются подклассами общего суперкласса. Так что я хотел бы сделать:
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 };
Но тогда я получаю предупреждение об общем:
Класс является необработанным типом. Ссылки на универсальный тип Class должны быть параметризованы.
Я пытаюсь; Я пытаюсь! :) Кроме того, на этом этапе, даже если это не вызвало предупреждение, я теряю часть интерфейса, который я пытался определить. Я не хочу просто возвращать массив произвольных классов; Я хочу вернуть массив классов, которые являются подклассами определенного суперкласса!
В Eclipse есть несколько довольно мощных инструментов для определения того, какие параметры использовать для исправления объявлений обобщенных типов, но в этом случае он падает, как это обычно бывает при работе с Class. Предложенная процедура «Infer Generic Type Arguments» вообще не меняет код, оставляя предупреждение.
Я смог обойти это, используя вместо этого коллекцию:
List<Class<? extends SuperClass>> availableTypes = new List<Class<? extends SuperClass>>();
Но как правильно сделать это с массивами?