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