Java - передача класса с аннотацией к универсальному методу - PullRequest
2 голосов
/ 12 января 2012

Я работаю с JPA 2 и использую следующий метод:

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, Class) в типе FetchData не применяется для аргументов (EntityManager, Class )

Я попытался просто указать параметр Class klass, без обобщений:

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

Это заставило мою IDE предложить:

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

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

1 Ответ

7 голосов
/ 12 января 2012

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

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

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

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