2012-01-11 2 views
2

Я работаю с JPA 2 и имею следующий метод:Java - прохождение класса с аннотацией к родовой методе

private static void wipeTable(EntityManager em, Class<? extends Table> klass) { 
    String tableName = klass.getAnnotation(Table.class).name(); 
    ... 
} 

Я думаю, что есть проблема с параметром Class<? extends Table>. У меня есть класс сущностей, как так:

@Entity 
@Table(name = "collections") 
public class Collection extends MyOtherClass implements Serializable { ... } 

я могу сделать Collection.class.getAnnotation(Table.class).name() просто отлично, так что я хочу, чтобы иметь возможность передавать Collection в качестве параметра. Просто позвонив wipeTable(em, Collection.class); имеет следующую ошибку, хотя:

Метод wipeTable (EntityManager, класс < расширяет таблицу >?) В типе FetchData не применим для аргументов (EntityManager, класс < Коллекция >)

Я пытался просто с параметром быть Class klass, без дженериков:

private static void wipeTable(EntityManager em, Class klass) { 
    String tableName = ((Table)klass.getAnnotation(Table.class)).name(); 

Это привело к тому, что моя IDE предложила:

Класс нестандартного типа. Ссылки на общий тип Класс должен быть параметризован

Я использую Java 1.5. Есть ли способ сказать «дать мне параметр типа Class, который аннотируется @Table»?

+0

вы не можете просто использовать список

в подписи метода или какой-то высшей абстракции? – dbrin

ответ

7

Я понимаю, чего вы пытаетесь выполнить, но поймите, что Collection не расширяет таблицу, на ней есть аннотация для таблицы. Измените подпись на что-то вроде этого:

private static <T> void wipeTable(EntityManager em, Class<T> klass) 

Что касается второго пункта, нет никакого способа, проходя ваш параметр Class поместить ограничение на нее, чтобы иметь определенную аннотацию. Но вы можете проверка на наличие аннотаций в вашем методе:

Table tableAnnotation = klass.getAnnotation(Table.class); 
if(tableAnnotation != null) { 
    // logic here 
} 
+0

Спасибо. Поскольку невозможно ограничить параметры класса аннотацией, есть ли смысл иметь класс Class klass', а не 'Class klass', за исключением того, что IDE не ворчит? –

+0

Это было бы правильно. Предполагая, что вы не делаете дополнительной логики, требующей знания общего типа, тогда общий параметр должен только сделать компилятор счастливым. – Perception

+0

Стоит отметить, что вам не нужно вводить параметр типа для сигнатуры метода, если вы просто используете 'Class ' как тип параметра. – megaflop

 Смежные вопросы

  • Нет связанных вопросов^_^