一个关于反射,泛型的问题,欢迎讨论···

设计一个方法,传入一个class对象,返回这个class的类名,这个需求本身不难,代码如下:
[code="java"]public class GenericsTest {

protected static  <E>  String getEntityName(Class<E> clazz) {
    // TODO Auto-generated method stub
    String entityName = clazz.getSimpleName();
    Entity entity = clazz.getAnnotation(Entity.class);
    if(entity != null && !"".equals(entity.name())){
        entityName = entity.name();
    }
    return entityName;
}


public static void main(String [] args){
    GenericsTest g = new GenericsTest();
    System.out.println(GenericsTest.getEntityName(g.getClass()));
}

}[/code]

问题在于:如果我将上面的getEntityname方法的泛型参数去掉的话就会报错,编译不通过,我不明白的就是这里的到底有什么作用???我在调用getEntityname的时候并没有给他传递泛型参数,但是却不能没有这个泛型参数,这奇怪啊,欢迎讨论!!!

去掉泛型参数代码如下:
[code="java"]public class GenericsTest {

protected static   String getEntityName(Class clazz) {
    // TODO Auto-generated method stub
    String entityName = clazz.getSimpleName();
    Entity entity = clazz.getAnnotation(Entity.class);
    if(entity != null && !"".equals(entity.name())){
        entityName = entity.name();
    }
    return entityName;
}


public static void main(String [] args){
    GenericsTest g = new GenericsTest();
    System.out.println(GenericsTest.getEntityName(g.getClass()));
}

}[/code]

方法改成如下即可:
[code="java"]
protected static String getEntityName(Class clazz) {
// TODO Auto-generated method stub
String entityName = clazz.getSimpleName();
Annotation anno = clazz.getAnnotation(Entity.class);
if(anno instanceof Entity)
{
Entity entity = (Entity)anno;
if(entity != null && !"".equals(entity.name())){
entityName = entity.name();
}
}
return entityName;
}
[/code]
实际上那个编译错误,跟泛型无关,而是由于class.getAnnotation返回的是Annotation,而你直接用Entity entity =class.getAnnotation导致类型转换编译时失败。

Entity这个类呢?

就是泛型 代表的 是你传入的class可以是任意类型的、、

如果去掉getEntityName方法前的E, 那么GenericsTest 就是一个普通的类,自己不是泛型,getEntityName也不是泛型方法,Class clazz中的E 就无法解析,编译器不知道E是从哪来的。

要么让GenericsTest 为泛型类GenericsTest
要么就申明getEntityName为泛型方法 String getEntityName(Class clazz)

其实你要明白Class这个类就是个带有泛型定义的类。如果你把Class 变成Class 是不是会有警告。
XX.getClass()得到的是Class.所以你调用getEntityname其实是传了泛型参数进去的。