浏览 613 次
|
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
时间:2008-07-02
最近参考网上的范型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 of getEClass method, of class tmp.
*/
@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实现取范型类都是这么去的。真不知道我是哪里错了。 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间:2008-07-02
T是不存在的,获取不到
|
|
| 返回顶楼 | |
|
时间:2008-07-02
又在论坛里反复搜寻了一下,发现还真是。除非用父类<范型> 引用 = 一个继承了已经范型好的父类的子类才可以得到。昏死,居然这么麻烦。
|
|
| 返回顶楼 | |
|
时间:2008-07-02
必须继承才能获取到的
实际上泛型语法没有多大意义,而且一不小心就会出错,少用为好 |
|
| 返回顶楼 | |
|
时间:2008-07-02
xly_971223 写道 必须继承才能获取到的
实际上泛型语法没有多大意义,而且一不小心就会出错,少用为好 是啊,T只不过是个类型参数,本身就是个符号而已。 如果要取得类型,可以参考springside的泛型DAO的实现啊。 |
|
| 返回顶楼 | |
|
时间:2008-07-03
泛型DAO实现不难,不过如果在Spring里用不灵。
|
|
| 返回顶楼 | |
|
时间:2008-07-03
yujianqiu 写道 泛型DAO实现不难,不过如果在Spring里用不灵。
SpringSide里的泛型DAO就是在Spring里的,没问题的,我就在用。 你看一下源码就知道一些细节上的问题了,反正是SpringSide里顺利解决了一些小问题,就能正常工作了。 |
|
| 返回顶楼 | |
|
时间:2008-07-03
# public tmp() {
TmpChild extends Tmp<XXX> 这里的XXX是一个具体的类,不是范型。
|
|
| 返回顶楼 | |








