在使用范型的时候如何获得类<T>中的这个T的类型呢?最近参考网上的范型Dao自己写了一个。但是发现按照网上的说法,类居然无法实例化。 我专门把那部分代码提了出来,单独写了个小测试。 范型类 - public class tmp<T> {
-
- private Class<T> eClass;
-
- public tmp() {
- super();
- eClass = (Class<T>)((ParameterizedType)(this.getClass().getGenericSuperclass())).getActualTypeArguments()[0];
- }
-
- public Class<T> getEClass() {
- return eClass;
- }
-
- public void setEClass(Class<T> eClass) {
- this.eClass = eClass;
- }
- }
Junit测试如下: - public class tmpTest {
-
- public tmpTest() {
- }
-
- @BeforeClass
- public static void setUpClass() throws Exception {
- }
-
- @AfterClass
- public static void tearDownClass() throws Exception {
- }
-
- @Before
- public void setUp() {
- }
-
- @After
- public void tearDown() {
- }
-
-
-
-
- @Test
- public void testNewClass() {
- tmp<String> tmap = new tmp<String>();
- Class s = String.class;
- assertEquals(s,tmap.getEClass());
- fail("The test case is a prototype.");
- }
-
-
-
- }
最后出现如下错误 - Testcase: testNewClass(org.Miao.tmpTest): Caused an ERROR
- java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
- java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
- at org.Miao.tmp.<init>(tmp.java:21)
- at org.Miao.tmpTest.testNewClass(tmpTest.java:45)
-
-
- Test org.Miao.tmpTest FAILED
- test-report:
- D:\nMiao\tmp\nbproject\build-impl.xml:540: Some tests failed; see details above.
- 生成失败(总时间:0 秒)
也就是说类根本无法实例化。是因为((ParameterizedType)(this.getClass().getGenericSuperclass())无法强转。我网上看了一下,几乎所有的范型Dao实现取范型类都是这么去的。真不知道我是哪里错了。
=========================================================================================== 又在论坛里反复搜寻了一下,发现还真是。除非用父类<范型> 引用 = 一个继承了已经范型好的父类的子类才可以得到。昏死,居然这么麻烦。
# public tmp() { # super(); # eClass = (Class<T>)((ParameterizedType)(this.getClass().getGenericSuperclass())).getActualTypeArguments()[0]; # }
看到红色这块的代码就差不多明白了。。 始终需要一个具体的子类,上面的代码才能达到目的 TmpChild extends Tmp<XXX> 这里的XXX是一个具体的类,不是范型。
|