Java - 将带有注释的类传递给泛型方法

时间:2012-01-11 20:44:23

标签: java generics annotations raw-types java-5

我正在使用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);会出现以下错误:

  

FetchData类型中的方法wipeTable(EntityManager,Class&lt;?extends Table&gt;)不适用于参数(EntityManager,Class&lt; Collection&gt;)

我尝试将参数设为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 个答案:

答案 0 :(得分:7)

我理解你要完成的是什么,但是意识到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
}