Java 获得 泛型类型
2016-07-15 15:58
411 查看
对于Class而言T已经被擦拭为Object,而真正的T参数被转到使用T的方法 (或者变量声明或者其它使用T的地方)里面(如果没有那就没有存根),所以无法反射到T的具体类别,也就无法得到T.class。而 getGenericSuperclass()是Generic继承的特例,对于这种情况子类会保存父类的Generic参数类型,返回一个 ParameterizedType,这时可以获取到父类的T.class了,这也正是子类确定应该继承什么T的方法。
输出:
getClass()==class com.example.test.subParam
type = com.example.test.param<com.example.test.Myclass, com.example.test.Myinvoke>
trueType1 = class com.example.test.Myclass
trueType2 = class com.example.test.Myinvoke
B is A's super class :0
贴一个看到代码
public class param<T1, T2> { class A {} class B extends A {} private Class<T1> entityClass; protected param (){ Type type = getClass().getGenericSuperclass(); System.out.println("getClass()==" + getClass()); System.out.println("type = " + type); Type trueType = ((ParameterizedType)type).getActualTypeArguments()[0]; System.out.println("trueType1 = " + trueType); trueType = ((ParameterizedType)type).getActualTypeArguments()[1]; System.out.println("trueType2 = " + trueType); this.entityClass = (Class<T1>)trueType; B t = new B(); type = t.getClass().getGenericSuperclass(); System.out.println("B is A's super class :" + ((ParameterizedType)type).getActualTypeArguments().length); } }
public class subParam extends param<Myclass, Myinvoke> { public static void main(String[] args) throws Exception{ subParam s = new subParam(); } }
输出:
getClass()==class com.example.test.subParam
type = com.example.test.param<com.example.test.Myclass, com.example.test.Myinvoke>
trueType1 = class com.example.test.Myclass
trueType2 = class com.example.test.Myinvoke
B is A's super class :0
贴一个看到代码
public class RawDao<T> { protected Class<T> clazz; @SuppressWarnings("unchecked") public RawDao() { @SuppressWarnings("rawtypes") Class clazz = getClass(); while (clazz != Object.class) { Type t = clazz.getGenericSuperclass(); if (t instanceof ParameterizedType) { Type[] args = ((ParameterizedType) t).getActualTypeArguments(); if (args[0] instanceof Class) { this.clazz = (Class<T>) args[0]; break; } } clazz = clazz.getSuperclass(); } }
相关文章推荐
- intelliJ idea 中添加gradle java项目
- Java Servlet技术
- java中的interface
- Struts2的配置
- Java中的static关键字解析
- spring注解:@Repository、@Service、@Controller
- Jprofile(一) - 连接本地服务器
- Eclipse 反编译插件 —— Java Class Decompiler
- Java逻辑运算符
- Java常用命令行工具
- 10.Java 基础 - 代理
- Java 集合类详解
- Spring学习笔记----事务管理
- Struts2 的action异常
- RabbitMQ学习(十)之spring整合发送同步消息(注解实现)
- Java 基础知识汇总
- JAVA BIO、NIO、AIO理解
- RabbitMQ学习(九)之spring整合发送同步消息
- struts2--封装数据
- JAVA jdk环境变量的配置