我建了一个简单的DAO,使用的spring+hibernate框架,数据库表是一个users表,实体如下:
package com.ssh.entity;import java.io.Serializable;public class Users implements Serializable {
private static final long serialVersionUID = 1L; private Long userid; private String username; private String password; private Long role;
public Long getUserid() {
return this.userid;
} public void setUserid(Long userid) {
this.userid = userid;
} public String getUsername() {
return this.username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return this.password;
} public void setPassword(String password) {
this.password = password;
} public Long getRole() {
return this.role;
} public void setRole(Long role) {
this.role = role;
}
}
定义了一个泛型的接口GenericDao用来执行增删改和读取操作也就是CRUD:
package com.fan;import java.io.Serializable;public interface GenericDao<T,PK extends Serializable> {
PK create(T newInstance);
T read(PK id);
void update(T transientObject);
void delete(T persistentObject);
}再看看他的实现:
package com.fan;import java.io.Serializable;import org.springframework.orm.hibernate3.support.HibernateDaoSupport;public class GenericDaoHibernateImpl<T,PK extends Serializable> extends HibernateDaoSupport implements GenericDao,FinderExecutor {
private Class type; public GenericDaoHibernateImpl(Class ctype){
this.type=ctype;
} public void delete(Object persistentObject) {
this.getHibernateTemplate().delete(persistentObject);
} @SuppressWarnings("unchecked")
public T read(Serializable id) {
return (T)this.getHibernateTemplate().get(type,id);
} public void update(Object transientObject) {
this.getHibernateTemplate().merge(transientObject);
} @SuppressWarnings("unchecked")
public PK create(Object newInstance) {
return (PK)this.getHibernateTemplate().save(newInstance);
}
}这样实现没有任何问题,但是很明显方法参数和接口的不同,是具体类型并不是泛型,返回值可以用泛型。我所期望的实现应该是这样的:        public void delete(T persistentObject) {
this.getHibernateTemplate().delete(persistentObject);
} @SuppressWarnings("unchecked")
public T read(PK id) {
return (T)this.getHibernateTemplate().get(type,id);
} public void update(T transientObject) {
this.getHibernateTemplate().merge(transientObject);
} @SuppressWarnings("unchecked")
public PK create(T newInstance) {
return (PK)this.getHibernateTemplate().save(newInstance);
}
当我改成这样以后就报编译错,说这两个方法has same erasure but does not override it.
spring-config.xml:
        <bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName">
<value>oracle.jdbc.driver.OracleDriver</value>
</property>
<property name="url">
<value>jdbc:oracle:thin:@localhost:1521:Oracle9I</value>
</property>
<property name="username">
<value>joe</value>
</property>
<property name="password">
<value>joe</value>
</property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.Oracle9Dialect
</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>com/ssh/entity/Users.hbm.xml</value>
</list>
</property>
</bean>
<bean id="usersDao" class="com.fan.GenericDaoHibernateImpl">
<constructor-arg index="0">
<value>com.ssh.entity.Users</value>
</constructor-arg>
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
对于泛型我是初学者,请各位高手指出我这样做是否可行,或者错误在哪里,谢谢。

解决方案 »

  1.   

    @Override加上这个在你的重写的方法前面。
      

  2.   

    加了以后还是报错,提示我必须重写父类的方法,must override a superclass method,
    我用的是eclipse5.1,JDK是5.0,我想应该不是环境的问题,因为泛型是可以用的。
      

  3.   

    而且有一个很奇怪的现象,不实现接口直接定义一个类就不报错。
    public class GenericDaoImpl<T,PK extends Serializable>{ public PK create(T newInstance) {
    // TODO Auto-generated method stub
    return null;
    } public void delete(T persistentObject) {
    // TODO Auto-generated method stub

    } public Object read(PK id) {
    // TODO Auto-generated method stub
    return null;
    }

    public void update(T transientObject) {
    // TODO Auto-generated method stub

    }

    }
      

  4.   

    最后我还是自己解决了,原来是要在实现类所声明的接口后面也加上泛型,只不过这个地方不能使用extends关键字来圈定参数的类型域。
    package com.fan;import java.io.Serializable;import org.springframework.orm.hibernate3.support.HibernateDaoSupport;public class GenericDaoHibernateImpl<T,PK extends Serializable> extends HibernateDaoSupport implements GenericDao<T,Serializable>,FinderExecutor {
    private Class type; public GenericDaoHibernateImpl(Class ctype){
    this.type=ctype;
    } public void delete(T persistentObject) {
    this.getHibernateTemplate().delete(persistentObject);
    } @SuppressWarnings("unchecked")
    public T read(PK id) {
    return (T)this.getHibernateTemplate().get(type,id);
    } public void update(T transientObject) {
    this.getHibernateTemplate().merge(transientObject);
    }

    @SuppressWarnings("unchecked")
    public PK create(T newInstance) {
    return (PK)this.getHibernateTemplate().save(newInstance);
    }

    }
    这样就可以了,帮我一起思考的仁兄一样有分。
      

  5.   

    很明显了,你实现了你的GenericDao 接口,那你必须override 它所有的方法!
    包括方法名,返回值,参数必须一致!