为什么DAO设计时要写成接口而不是抽象类?

在JAVA EE中,我们设计DAO的时候,发现所有的项目都是写成接口形式,然后使用具体的DAO对象去实现这个接口,如:
public interface GenericDao<T> {
public List<T> findByID(Long id);
}
class UserDao implements GenericDao<User> {
@Override
public List<User> findByID(Long id) {
return null;
}
}

我的问题是:为什么DAO不采用抽象类的方式来写呢?
我个人认为DAO的设计可以采用抽象类的方式来做,如:
public abstract class GenericDao<T> {
public abstract List<T> findByID(Long id);
}
class UserDao extends GenericDao<User> {
@Override
public List<User> findByID(Long id) {
return null;
}
}

因为抽象类与子类的关系属于"is-a",而接口代表的是“协议”。
有些人说使用接口是为了避免只能单继承,我觉得这个说法不够说服力,请大家帮我解答一下,谢谢!

可以采取抽象类,Spring的JDBCtemp或HibernateTemp等都是使用模板抽象类。