为了账号安全,请及时绑定邮箱和手机立即绑定

为什么在测试方法中接收类型必须要使用接口类型,而不能使用具体的实现类?

为什么在测试方法中接收类型必须要使用接口类型,而不能使用具体的实现类?在配置ProxyFactoryBean的时候不是指定了具体的target了么?

正在回答

7 回答

代理类代理的应该是接口,而不是接口的具体实现类。接口指的是一类的事情,所以代理接口才有意义。比如中介代理的表面上是某个房东,其实是代理出租一类的事情。

0 回复 有任何疑惑可以回复我~

试了一下,是这样的,如果 BizLogicImpl 实现了接口,就必须使用接口类型,否则可以不用

0 回复 有任何疑惑可以回复我~

貌似确实必须使用接口

0 回复 有任何疑惑可以回复我~


知道为什么了吗?

0 回复 有任何疑惑可以回复我~

<bean id="bizLogicImplTarget" class="com.imooc.aop.api.BizLogicImpl"></bean>
     <bean id="bizLogicImpl" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="proxyInterfaces">
        <value>com.imooc.aop.api.BizLogic</value>
    </property>
        <property name="target">
            <!-- <bean class="com.imooc.aop.api.BizLogicImpl"></bean> -->
             <ref bean="bizLogicImplTarget"/>
        </property>
        <property name="interceptorNames">
            <list>
                <value>moocBeforeAdvice</value>
                <value>moocAfterReturningAdvice</value>
                <value>moocMethodInterceptor</value>
                <value>moocThrowsAdvice</value>
            </list>
        </property>
    </bean>

如上述在XML文件中所示,为BizLogicImpl创建代理。那么在测试方法中得到的就是一个代理类,而这个代理类的类型是<property name="proxyInterfaces">
        <value>com.imooc.aop.api.BizLogic</value>
    </property>里面设置的接口的类型。

就是说得到的JDK代理类型是BizLogic类型的,而你在测试方法中用BizLogic的实现类BizLogicImpl来接受这个代理,显然类型不能从父类转换成子类,所以报了ClassCastException。

0 回复 有任何疑惑可以回复我~

我在尝试使用具体类的时候异常了。 

0 回复 有任何疑惑可以回复我~

可以使用具体实现类。

至于为什么使用接口类型,这是面向对象的思想。这个要你理解了面向对象的设计原则及其好处,才能理解为何常用接口。

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

为什么在测试方法中接收类型必须要使用接口类型,而不能使用具体的实现类?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信