JAVA的反射和泛型有关问题

JAVA的反射和泛型问题

设计一个方法,传入一个class对象,返回这个class的类名,这个需求本身不难,代码如下: 

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()));  
    }  
}  


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

去掉泛型参数代码如下:

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()));  
    }  
}  

其中Entity是jpa的一个类 
import javax.persistence.Entity;

 

北风网解答:

方法改成如下即可:

protected static <E> 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;  
}  

 

实际上那个编译错误,跟<E>泛型无关,而是由于class.getAnnotation返回的是Annotation,而你直接用Entity entity =class.getAnnotation导致类型转换编译时失败。


原帖查看:http://bbs.ibeifeng.com/read-htm-tid-65619.html

其他阅读:Activiti视频教程 基于Activiti5工作流实战企业协同OA办公系统:http://www.ibeifeng.com/goods-343.html