Преобразовать Class [] в дженерики?

Я все еще пытаюсь использовать дженерики Java. У меня нет никаких проблем с использованием типизированных коллекций, но большая часть остального, кажется, ускользает от меня.

Прямо сейчас я пытаюсь использовать JUnit "PrivateAccessor", для которого требуется аргумент Class [] со списком всех типов аргументов для вызываемого частного метода. В Java 1.4 я бы определил это как

Class[] args = new Class[] { Collection.class, ArrayList.class };

но фактический код определен так, чтобы теперь принимать аргументы

myMethod(Collection<MyClass1> first, ArrayList<MyClass2> second)

Я попытался изменить определение аргументов на

Class<? extends Object>[] args = new Class<? extends Object>[] 
{ Collection<MyClass1>.class, ArrayList<MyClass2>.class };

Но Eclipse ставит красный маркер на закрывающие> s и говорит, что в этот момент ожидает "void". Могу ли я сделать это с помощью дженериков или не стоит беспокоиться?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
348
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Это правильный синтаксис:

Class<?>[] paramTypes = new Class[]{ Collection.class, ArrayList.class };
Ответ принят как подходящий

Первая проблема заключается в том, что вы должны использовать

Class<?>[] args = new Class[]

вместо

Class<? extends Object>[] args = new Class<? extends Object>[]

Этот объясняет почему.

Ваша вторая проблема заключается в том, что вы должны использовать

{ Collection.class, ArrayList.class };

вместо

{ Collection<MyClass1>.class, ArrayList<MyClass2>.class };

Это связано с тем, что XXX.class оценивается во время выполнения после выполнения стирание типа, поэтому указание аргумента типа бесполезно, а значит, запрещено.

Я настоятельно рекомендую Часто задаваемые вопросы, из которого я связал два приведенных выше объяснения, для «земного» подхода к обобщениям Java, который прояснит большинство вопросов.

Вы можете прочитать FAQ Анжелики для более подробного объяснения того, почему создание массивов конкретных параметризованных типов не разрешено.

yc

Просто заметил, что я дважды разместил ссылку, на которую ссылается dumitriu. Но этот приведет вас прямо к теме, о которой мы говорим.

yclian 18.11.2008 03:13

Другие вопросы по теме