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