问答详情
源自:6-2 ProxyFactoryBean及相关内容(上)

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

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

提问者:慕慕5709873 2016-02-23 15:33

个回答

  • qq_慕用9161146
    2021-03-07 16:32:43

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

  • qq_幸福客_0
    2017-02-13 16:41:31

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

  • qq_幸福客_0
    2017-02-13 16:26:42

    貌似确实必须使用接口

  • SunsunDay
    2016-10-12 19:18:30


    知道为什么了吗?

  • java家洼
    2016-05-11 11:30:09

    <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。

  • 慕慕5709873
    2016-02-25 09:17:47

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

  • 河边的大巫
    2016-02-24 16:33:52

    可以使用具体实现类。

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