如何获取继承类中的泛型T的类型
2015-02-27 17:30
387 查看
首先, T.getClass() 或 T.class都是非法的,因为T是泛型变量;
由于一个类的类型在编译期已确定,故不能在运行期得到T的实际类型;
获取方式如下:
上面的代码不是万能的,只有实例化T的子类才能按上述方法获得T的实际类型,
如果子类没有实例化T,则无法获取T的实际类型;
比如,class B 并没有实例化T,所以得不到String.class;
代码如下:
正确的代码如下:
class C按如上方式声明,则可以得到String.class;
以上转载(有所修改)自 http://bbs.chinaunix.net/thread-3677562-1-1.html
对于获取泛型的方法,比较完整的代码如下,
class BaseDaoImpl<T> implements IBaseDao<T> {
public BaseDaoImpl() {
Class<T> clz = (Class<T>) getSuperClassGenricType(this.getClass());
System.out.println(clz);
}
/**
* 通过反射,获得定义Class时声明的父类的泛型参数的类型. 如无法找到,返回Object.class
*/
public static Class<Object> getSuperClassGenricType(final Class clz) {
Type type = clz.getGenericSuperclass();
if(!(type instanceof ParameterizedType)) {
return Object.class;
}
Type[] params = ((ParameterizedType)type).getActualTypeArguments();
if(!(params[0] instanceof Class)) {
return Object.class;
}
return (Class) params[0];
}
}
以上代码参考:http://blog.csdn.net/running_snail_/article/details/7077947
另外,badqiu的脚手架项目代码中,有另外一种方式,父类本身不获取泛型的具体类型,
仅提供抽象方法,由子类来提供具体的类型;
另外,请参考 http://developer.51cto.com/art/201103/250028.htm
由于一个类的类型在编译期已确定,故不能在运行期得到T的实际类型;
获取方式如下:
abstract class A<T> { public Class<T> getGenericType() { Class<T> clz = (Class<T>) (((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0]); return clz; } }
上面的代码不是万能的,只有实例化T的子类才能按上述方法获得T的实际类型,
如果子类没有实例化T,则无法获取T的实际类型;
比如,class B 并没有实例化T,所以得不到String.class;
代码如下:
class B<T> extends A<T> { public static void main(String[] args) { B<String> b = new B<String>(); System.out.println(b.getGenericType()); } }
正确的代码如下:
class C extends A<String> { public static void main(String[] args) { C c = new C(); System.out.println(c.getGenericType()); } }
class C按如上方式声明,则可以得到String.class;
以上转载(有所修改)自 http://bbs.chinaunix.net/thread-3677562-1-1.html
对于获取泛型的方法,比较完整的代码如下,
class BaseDaoImpl<T> implements IBaseDao<T> {
public BaseDaoImpl() {
Class<T> clz = (Class<T>) getSuperClassGenricType(this.getClass());
System.out.println(clz);
}
/**
* 通过反射,获得定义Class时声明的父类的泛型参数的类型. 如无法找到,返回Object.class
*/
public static Class<Object> getSuperClassGenricType(final Class clz) {
Type type = clz.getGenericSuperclass();
if(!(type instanceof ParameterizedType)) {
return Object.class;
}
Type[] params = ((ParameterizedType)type).getActualTypeArguments();
if(!(params[0] instanceof Class)) {
return Object.class;
}
return (Class) params[0];
}
}
以上代码参考:http://blog.csdn.net/running_snail_/article/details/7077947
另外,badqiu的脚手架项目代码中,有另外一种方式,父类本身不获取泛型的具体类型,
仅提供抽象方法,由子类来提供具体的类型;
public abstract class A<T> { public abstract Class getEntityClass(); } public class B extends A<String> { public Class getEntityClass() { return String.class; } }
另外,请参考 http://developer.51cto.com/art/201103/250028.htm
相关文章推荐
- 如何获取继承中泛型T的类型
- Java子类中获取继承时传入泛型的类型
- 如何获取方法参数的泛型类型
- 一、获取子类DAO继承父类DAO的泛型参数类型的Class对象
- Java 运行时如何获取泛型参数的类型
- 其他-如何获取父类中的泛型T的类型
- 如何获取java中泛型参数的实际类型--反射获取
- Java 运行时如何获取泛型参数的类型
- Class的 getSuperclass与getGenericSuperclass区别和如何获取泛型参数类型
- Java 运行时如何获取泛型参数的类型
- 如何通过反射获取泛型的具体类型
- 如何在运行时获取泛型的类型
- 关于如何获取泛型参数的实体类型
- 如何获取磁盘分区信息(包括卷标、序列号、类型、总大小、剩余大小)
- 如何获取JS变量类型
- [转]如何取得java泛型里的类型
- 如何获取指定表的列和数据类型
- 动态提交表单时,如何获取参数类型
- 如何获取Oracle存储过程中的参数名称、类型?
- 如何获取业务表中各位业务员的业务类型A与业务类型B的业务金额