`

关于BaseDao使用泛型时出错

 
阅读更多

 

      我在练手项目中,编写了一个BaseDao(使用泛型)的基本实现类

 

如下代码:

 

 

public class BaseDaoImpl<T> implements IBaseDao<T> {

	private Class<T> entityClass;

    // 构造函数: 1. 获取当前运行类的参数化类型; 2. 获取参数化类型中实际类型的定义(class)
    public BaseDaoImpl() {    	
    	entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    	
    }
    
	public Session getSession() {
		return HibernateSessionFactory.getSession();
	}	
	public void closeSession(){
		HibernateSessionFactory.closeSession();
	}
        
        /*  省略本分代码  */

}

      

      但是我在struts2的框架 UserAction里直接使用了如上基本实现类BaseDaoImpl<T>

 

//这就是出错的原因
private BaseDao<HouseUser> dao = new BaseDaoImpl<HouseUser>();

 

导致在jsp页面跳转到UserAction就会报 错

  java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType 

 

----------------------------------------------------------------------------------

最后找到问题所在

     原因是我运行时传参,在UserAction使用 BaseDao 的基本实现 BaseDaoImpl<T>时,才确定泛型类型

这样就会出错
      因为 泛型类型 是要在编译时就确定的,如果运行时去设置泛型类型,编译器就会出现类型转换错误


----------------------------------------------------------------------------------
解决办法:
先  编写 接口继承 我的BaseDao,给他指明类型
public interface IUserDao extends BaseDaoImpl<User> {
     /*  省略部分代码 */
    public void add(User user, Integer groupid);
}

 

在 编写上面接口的实现类
public class UseDaoImpl extends BaseDaoImpl<User> implements IUserDao{

     /*  
       这里去实现你的  UserDao
*/
}

----------------------------------------------
      就是要在编译时就确定 BaseDaoImpl<User> 里是类型

java的泛型在编译的时候可以保证,但是运行的时候泛型是会被擦除的。

分享到:
评论

相关推荐

    hibernate basedao(泛型版本)

    在给定的“hibernate basedao(泛型版本)”中,开发人员通过引入泛型进一步提高了代码的复用性和灵活性。泛型是Java SE 5.0引入的新特性,它允许在类、接口和方法中使用类型参数,从而实现更强大的类型检查和减少...

    java泛型BaseDao与BaseService

    在Java中,我们可以使用泛型来让BaseDao更加通用。例如,我们可以声明一个泛型接口`BaseDao&lt;T&gt;`,其中T代表我们将要操作的实体类型。这样,每个具体的DAO实现类(如`UserDao extends BaseDao&lt;User&gt;`)就可以操作特定...

    basedao_basedao数据库_

    在IT行业中,数据库操作是应用程序开发中的重要环节。"基于BaseDao的手动数据库操作"是一...在实际开发中,使用BaseDao可以大大提高开发效率,但同时也要注意避免过度抽象和通用性问题,确保代码的可维护性和可扩展性。

    SpringBoot_BaseDao.zip

    "SpringBoot_BaseDao.zip"这个压缩包文件显然与SpringBoot相关的数据库操作有关,特别是关于BaseDao的基础使用和实现。在Java开发中,Dao(Data Access Object)层是负责处理数据访问的,通常用于与数据库进行交互。...

    java 基于泛型与反射的通用 DAO

    泛型是Java 5引入的新特性,它允许在类、接口和方法中使用类型参数,从而提高了代码的类型安全性和可读性。在`BaseDao.java`中,可能会定义一个泛型基类,如: ```java public abstract class BaseDao&lt;T&gt; { public...

    hibernate>>BaseDAO

    7. **泛型应用**:为了提高代码的可复用性和类型安全性,`BaseDAO`往往采用泛型设计。通过指定具体的实体类型,`BaseDAO&lt;T&gt;`可以为任何类型的实体提供数据访问服务。 8. **缓存支持**:Hibernate支持一级缓存...

    dbutils封装ORM 实现BaseDAO

    1. **泛型**: BaseDAO通常会使用泛型来定义与特定实体类的关联,这样在具体使用时可以避免类型转换的麻烦。 2. **基本操作**: 包含CRUD(Create, Read, Update, Delete)等基本数据库操作,如insert、update、...

    基于hibernate的baseDao

    本压缩包提供的"baseDAO"文件,包含了一个详细注释的BaseDAO实现,旨在提供一种易于理解和使用的Hibernate基础操作模板。 1. **Hibernate框架简介** Hibernate是一个开源的对象关系映射(ORM)框架,它简化了Java...

    基于Java web SSH框架的电影后台管理系统(源码+数据库).zip

    # 电影后台管理系统 ...- [x] baseDao定义泛型抽象出基本dao操作 ## 导入项目 ### 导入SQL文件 进入到db文件夹,将ssh.sql文件导入到数据库中 ### 修改数据库密码 修改hibernate.cfg.xml文件 ```xml ...

    Android 使用ORMLite打造万能泛型Dao简化数据持久化层

    在Android应用开发中,数据持久化是一个至关重要的环节,它涉及到如何将应用程序中的数据存储到本地,以便在后续使用时能够快速访问。ORMLite是一个轻量级的Java ORM(对象关系映射)库,它可以帮助开发者简化数据库...

    常用的BaseDAO及其实现

    "常用的BaseDAO及其实现" BaseDAO是Java中一种常用的数据访问对象(DAO),它提供了统一的数据访问接口,封装了数据访问的基本操作。BaseDAO通常是通过继承HibernateDaoSupport类实现的。 BaseDAO的主要功能包括:...

    NC65通过BaseDAO操作数据库

    NC65通过BaseDAO操作数据库,包含接口类及接口实现类: /** * 获取baseDAO * @return */ public BaseDAO getBaseDAO() { if(baseDAO == null){ baseDAO = new BaseDAO(); } return baseDAO; } public ...

    mybatis basedao

    在使用MyBatis BaseDAO时,首先需要在项目中引入相关的依赖,通常是MyBatis的核心库以及BaseDAO的实现库。接下来,开发者需要定义自己的实体类,这些类对应数据库中的表结构。然后,创建Mapper接口,这个接口会继承...

    基于泛型反射的数据层封装+MSSQLJDBC3.0驱动

    例如,我们可以定义一个`BaseDAO&lt;T&gt;`,其中`T`是代表实体类的泛型参数,然后在具体使用时传入如`User.class`或`Product.class`。 反射则常用于动态获取类的信息,如类名、属性、方法等,以及在运行时调用这些方法。...

    JDBC连接池(通用basedao)可直接用的模板

    当应用程序需要与数据库交互时,不是每次都需要创建新的数据库连接,而是从连接池中获取已经存在的连接,使用完毕后再归还到池中,这样可以避免频繁创建和销毁连接带来的性能开销。常见的JDBC连接池工具有C3P0、DBCP...

    java公共类basedao

    这个是一个公共的basedao类。需要使用的话直接复制。内容看看就明白了

    Spring声明式事务及BaseDao完整版

    2. **事务管理**:Spring的声明式事务可以应用于BaseDao的方法,确保在出现异常时能正确回滚事务。 3. **模板方法**:在BaseDao中,可以定义模板方法,例如executeSql,子类在实现具体操作时调用这个模板方法,从而...

    ssh+baseDao实现分页

    在IT行业中,SSH(Spring、Struts、Hibernate)是一个经典的Java Web开发框架组合,而BaseDao是常用于数据访问层的一个基类设计。本话题主要围绕如何利用SSH框架结合BaseDao实现分页功能来展开。 首先,让我们了解...

    spring4.0 Generic Qualifier(泛型限定).docx

    在描述的示例中,我们看到`BaseDao`是一个泛型抽象类,它有一个泛参数`M extends Serializable`。`OrganizationDao`和`UserDao`分别继承自`BaseDao`,并具体化了泛型类型,`OrganizationDao`中的`M`为`Organization`...

    java BaseDao

    4. **提高可维护性**:当数据库操作方式发生变化时,只需修改BaseDao,不影响其他依赖它的DAO层代码。 **BaseDao的实现** 一个简单的BaseDao.java文件可能包含以下方法: 1. **插入(Insert)**:使用JDBC的...

Global site tag (gtag.js) - Google Analytics