获取T.class的完整例子

本文介绍了一种通过反射和继承获取泛型参数的具体类型的方法,并提供了完整的Java代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不用再纠结如何获取T.class了,我整理了一段完整的示例:


 
  1. package com.hankcs;
  2.  
  3. import java.lang.reflect.ParameterizedType;
  4. import java.lang.reflect.Type;
  5.  
  6. public class Main
  7. {
  8.  
  9.     public static void main(String[] args)
  10.     {
  11.         Foo<String> foo = new Foo<String>()
  12.         {
  13.         };
  14.         // 在类的外部这样获取
  15.         Type type = ((ParameterizedType)foo.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
  16.         System.out.println(type);
  17.         // 在类的内部这样获取
  18.         System.out.println(foo.getTClass());
  19.     }
  20. }
  21.  
  22. abstract class Foo<T>
  23. {
  24.     public Class<T> getTClass()
  25.     {
  26.         Class<T> tClass = (Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
  27.         return tClass;
  28.     }
  29. }

输出:


 
  1. class java.lang.String
  2. class java.lang.String

关于getGenericSuperclass等等的解释,请参考http://blog.youkuaiyun.com/gengv/article/details/5178055

我想补充的是,这里利用继承+反射来达到目的,反射的用法在上面的链接里讲得很清楚,不明白的话慢慢谷歌。继承是必须的,最重要的是必须有一个非泛型(我不知道这么讲准不准确,我的意思是类似于class <String>这样的非泛型,而不是class <T>这样的泛型)的类实例化才能达到目的,比如在上面的例子中就是这个匿名类:


 
  1.  Foo<String>()
  2.         {
  3.         };

不信的话你试试泛型继承:


 
  1. package com.hankcs;
  2.  
  3. import java.lang.reflect.ParameterizedType;
  4. import java.lang.reflect.Type;
  5.  
  6. public class Main
  7. {
  8.  
  9.     public static void main(String[] args)
  10.     {
  11.         Foo<String> foo = new Child<String>();
  12.         // 在类的外部这样获取
  13.         Type type = ((ParameterizedType)foo.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
  14.         System.out.println(type);
  15.         // 在类的内部这样获取
  16.         System.out.println(foo.getTClass());
  17.     }
  18. }
  19.  
  20. abstract class Foo<T>
  21. {
  22.     public Class<T> getTClass()
  23.     {
  24.         Class<T> tClass = (Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
  25.         return tClass;
  26.     }
  27. }
  28.  
  29. class Child<T> extends Foo
  30. {
  31.  
  32. }

输出:


 
  1. Exception in thread "main" java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
  2. at com.hankcs.Main.main(Main.java:13)
  3. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  4. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
  5. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  6. at java.lang.reflect.Method.invoke(Method.java:606)
  7. at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值