Преобразовать класс [] в дженерики? - PullRequest
2 голосов
/ 18 ноября 2008

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

Ответы [ 3 ]

6 голосов
/ 18 ноября 2008

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

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

вместо

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

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

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

{ Collection.class, ArrayList.class };

вместо

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

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

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

2 голосов
/ 18 ноября 2008

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

Ус

2 голосов
/ 18 ноября 2008

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

Class<?>[] paramTypes = new Class[]{ Collection.class, ArrayList.class };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...