我有一个BaseDao接口和其他扩展BaseDao的特定于实体的Dao接口。
public interface BaseDao<T extends RandomClass> {
// some methods
}
public interface FooDao extends BaseDao<RandomClassImpl1> {
// some methods
}
@Lazy
@Component(“fooDao”)
public class FooDaoImpl implements FooDao {
}
public interface BarDaoextends BaseDao<RandomClassImpl2> {
// some methods
}
@Lazy
@Component(“barDao”)
public class BarDaoImpl implements BarDao {
}
我还创建了一个配置,在其中创建了一个bean,该bean返回一个Map,其中dao组件名称是键,而dao组件是值。
@Lazy
@Configuration
@Import({BarDaoImpl.class, FooDaoImpl.class })
public class DaoRepositoryConfig {
@Bean(DAO_REPOSITORY)
Map<String, BaseDao> DaoRepository(
@Lazy @Qualifier(“fooDao”)
BaseDao<RandomClassImpl1> foo,
@Lazy @Qualifier(“barDao”)
BaseDao<RandomClassImpl2> bar
) {
Map<String, BaseDao> daoRepository = new HashMap<>();
daoRepository.put(“fooDao”, foo);
daoRepository.put(“barDao”, bar);
return daoRepository;
}
}
当我加载这个bean时,我会得到一个Dao名称的映射以及在配置中导入的相应实现的动态代理。
但是当我尝试将代理类型转换为直接父接口时,它将失败,并显示ClassCastException。
(FooDao)daoRepo.get(“ fooDao”)[在这里daoRepo.get(“ fooDao”),返回在调试器中可以看到的FooDaoImpl的代理,但是当我尝试将其强制转换为FooDao时,ClassCast异常是抛出。