如何获取继承类中的泛型T的类型

朴灿烈づ我的快乐病毒、 2022-08-07 02:39 212阅读 0赞

首先, T.getClass() 或 T.class都是非法的,因为T是泛型变量;
由于一个类的类型在编译期已确定,故不能在运行期得到T的实际类型;
获取方式如下:

  1. abstract class A<T> {
  2. public Class<T> getGenericType() {
  3. Class<T> clz = (Class<T>) (((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0]);
  4. return clz;
  5. }
  6. }

上面的代码不是万能的,只有实例化T的子类才能按上述方法获得T的实际类型,
如果子类没有实例化T,则无法获取T的实际类型;
比如,class B 并没有实例化T,所以得不到String.class;
代码如下:

  1. class B<T> extends A<T> {
  2. public static void main(String[] args) {
  3. B<String> b = new B<String>();
  4. System.out.println(b.getGenericType());
  5. }
  6. }

正确的 代码如下:

  1. class C extends A<String> {
  2. public static void main(String[] args) {
  3. C c = new C();
  4. System.out.println(c.getGenericType());
  5. }
  6. }

class C按如上方式声明,则可以得到String.class;

以上转载(有所修改)自 http://bbs.chinaunix.net/thread-3677562-1-1.html

对于获取泛型的方法,比较完整的代码如下,

  1. class BaseDaoImpl<T> implements IBaseDao<T> {
  2. public BaseDaoImpl() {
  3. Class<T> clz = (Class<T>) getSuperClassGenricType(this.getClass());
  4. System.out.println(clz);
  5. }
  6. /**
  7. * 通过反射,获得定义Class时声明的父类的泛型参数的类型. 如无法找到,返回Object.class
  8. */
  9. public static Class<Object> getSuperClassGenricType(final Class clz) {
  10. Type type = clz.getGenericSuperclass();
  11. if(!(type instanceof ParameterizedType)) {
  12. return Object.class;
  13. }
  14. Type[] params = ((ParameterizedType)type).getActualTypeArguments();
  15. if(!(params[0] instanceof Class)) {
  16. return Object.class;
  17. }
  18. return (Class) params[0];
  19. }
  20. }

以上代码参考:http://blog.csdn.net/running\_snail\_/article/details/7077947

另外,badqiu的脚手架项目代码中,有另外一种方式,父类本身不获取泛型的具体类型,

仅提供抽象方法,由子类来提供具体的类型;

  1. public abstract class A<T> {
  2. public abstract Class getEntityClass();
  3. }
  4. public class B extends A<String> {
  5. public Class getEntityClass() {
  6. return String.class;
  7. }
  8. }

另外,请参考 http://developer.51cto.com/art/201103/250028.htm

发表评论

表情:
评论列表 (有 0 条评论,212人围观)

还没有评论,来说两句吧...

相关阅读