开发者社区> 问答> 正文

java中泛型T class的获取? 400 报错

java中泛型T class的获取? 400 报错

我定义了一个泛型父类,用resovleClazzInfo方法获取实体的真是类型:


public abstract class AbstractDBDao<T extends DBModel> implements BaseDao<T> {

    private Class<T> entityClazz;

    public AbstractDBDao(Context context) {
        
        resovleClazzInfo();
    }
    
    private void resovleClazzInfo() {
        Type genType = getClass().getGenericSuperclass();  
        Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
        entityClazz = (Class) params[0];
    }
}



如果我定义个类去继承这个父类的话是可以拿到entityClass的,如class StudentDao extends AbstractDao<Student>。但是在静态方法里面使用多一层的继承类来获取,就会出错:



    static class NirvanaDao<T> extends AbstractDao<T> {
    }

    public static <T> BaseDao<T> getDao(Class<T> clazz) {
        BaseDao<T> dao = new NirvanaDao<T>();
        return dao;
    }

    public static main(String[] args) {
        getDao(StudentModel.class);
    }


错误如下:

Exception in thread "main" java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
	at com.xckevin.test.AbstractDao.<init>(AbstractDao.java:11)
	at com.xckevin.test.NirvanaDao.<init>(NirvanaDao.java:4)
	at com.xckevin.test.Test.main(Test.java:8)




求问为什么,原理是什么?如何解决这个问题。


展开
收起
爱吃鱼的程序员 2020-06-05 13:04:36 974 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    你这个一看就是静态内部类,不行的啦。

    你可以稍微搭一眼看看,你就会发现,你的StudentModel.class根本就没有传递到getDao方法里面的NirvanaDao的<T>上面去的哈。如果没传递过去值,那么在父类上调用getGenericSuperclass时,就因为当前类<T>没有具体值,就是,T代表的不是一个具体的类,而就是字母T,那就会报错咯吖。

    ######回复 @iuKa : 好的,谢谢你的帮助######回复 @iuKa : 不能,<T>中只能直接写类名字,这个类名字,在java中不是通过class能得到的,而且2个是不等同的概念。所以,不行。######是的,调试的时候发现确实是字母T。那么该怎么传递什么样的参数才能将T替换成StudentModel呢?######虽然我不会,但还是推荐把报的错贴出来吧######把Class<T> entityClazz;改成Class entityClazz;试试,粗看起来像在后面(class)params[0]赋值时无法转换类型。######谢谢提醒,已贴。######

    因为编译时的类型擦除机制,这样是取不到的,这个问题我在写框架时候就发现了

    具体你可以参考HibernateDaoSupport的实现和使用,也是泛型类,实际在用的时候,继承时<T>必须指定

    正如楼上所说,你只能取到T,不能取到具体的类,断点看看就知道了

    ######多谢提醒,立马去看。 那么就不能通过这种方法去生成dao了吗?这样每个Model需要实现一个实现一个dao,是不是太麻烦了。 另外想了一个办法就是动态生成class,然后加载使用。
    2020-06-05 13:04:50
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载