本人在看thinking in java,在接口一章看到一个嵌套接口的程序,不太明白,希望得到大家的帮助:class A {
    private interface B{
       void f();
    }
    class BImp implements B{
       void f(){};
    }
    B getB(){
        return new BImp();
    }
    public void receiveD(D d){}
   
}
class Test{
    public static void main(String[] args){
         A a = new A();
         A a2 = new A();
         a2.receiveB(a.getB());
为什么a2.receiveB(a.getB())是正确的呢?a.getB()返回的是一个私有的接口,应该不能用在Test类中啊

解决方案 »

  1.   

     私有接口只有定义它的类的对象有权访问 A不就是定义私有接口的类吗 如果不通过A的对象 应该没有办法使用a.getB() 这和Test类没有关系吧
      

  2.   

    楼主要搞清楚,Test里面访问的只是getB()这个方法而已,这个方法是有包访问权限,当然可以访问。所谓私有接口,只不过外部看不到而已,外部不能直接实例化而已,类的内部实例化好了把对象的引用返回出来,为什么外面不可以用?又并不是外面实例化的。
      

  3.   

    hehe, 楼主很细心啊,这都能注意到 :)我试了一下,果然如你所描述的那样。看上去确实有点奇怪,不过如果跟下面的程序对比一下,也许能说明点问题:
    //a2.receiveB( a.getB() );
    A.B b = a.getB(); // 这里会报错 The type A.B is not visible
    a2.receiveB( b );也就是说,如果试图“访问”或者“使用”这个私有接口的话,就会报错;相对而言,你原来的程序算是“只过了一下手”,所以就通融了,hehe,大概可以这么理解吧。■□■□■□■□■□■□■□■
    □             □
    ■  忍以明志 勤以致远  ■
    □             □
    ■□■□■□■□■□■□■□■
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
      

  4.   

    2楼的,照你说的,那为什么
    A.B ab = a.getB();会报错呢?
      

  5.   

    A.B ab = a.getB();在Test类中写A.B是不可以的,B这个私有接口对于Test类来说是不可见的但是仅是a.getB()就是仅仅是调用public的getB()这个方法,并没有访问其返回的私有类型.而就如Thanking in java中所列出的,任何要访问私有接口A.B的语句都是不会通过编译的A.B ab = a.getB(); a.getB().f();  不能访问接口的成员方法个人理解.
      

  6.   


    错误在于A.B,不在于a.getB(),B是私有的,A.B肯定报错,因为你根本访问不到A类里面的B接口,如何声明一个A.B的引用?A.B就已经是在外部访问B了,当然会编译错误。