Я все еще пытаюсь использовать дженерики 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". Могу ли я сделать это с помощью дженериков или не стоит беспокоиться?




Это правильный синтаксис:
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. Но этот приведет вас прямо к теме, о которой мы говорим.