BaseDaoImpl中的泛型初始化

我们写的XxxDao接口继承BaseDao接口,XxxDaoImpl继承BaseDaoImpl实现XxxDao。注意这里我们的Dao和DaoImpl都不用写泛型。

BaseDaoImpl实现了BaseDao,但它不需要写@Service,因为它是XxxDaoImpl的父类,而XxxDaoImpl上写了@Service,会被初始化而调用构造方法,BaseDaoImpl有一个成员变量Class clazz,如何在XxxDaoImpl初始化时,将Xxx写到T中?

protected BaseDaoImpl() {
        clazz = (Class)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
        if (clazz == null) {
            throw new IllegalArgumentException("无法获得泛型class。");
        }
    }

其中getClass的调用者是XxxDaoImpl对象,它的GenericSuperclass就是含泛型的BaseDaoImpl,因为XxxDaoImpl的父类BaseDaoImpl,getActualTypeArguments()是BaseDaoImpl上的泛型集合,这里只有一个泛型。取[0]就是第一个。所以Xxx就会被获取。通过这种方式实现了泛型的class的初始化。注意,这个不是指泛型注入,所谓泛型注入就是假设XxxServiceImpl继承BaseServiceImpl,而BaseServiceImpl里面用到了@autowide BaseDao,那么最终BaseDao里面的T会被注入Xxx。

编写一个类继承一个泛型类时,就会指定Xxx了,如 A extends B,A自己如果用不到泛型,就可以不用写成泛型类。

getGenericSuperclass和getSuperclass的区别是前者能获取到泛型,后者不行。

你可能感兴趣的:(BaseDaoImpl中的泛型初始化)