嵌套接口

在类中嵌套接口的语法是相当显而易见的,就像非嵌套接口一样,可以拥有public和“包访问”两种可视性。

package interfaces.nesting;

import org.omg.CORBA.PUBLIC_MEMBER;

class A {
    interface B {
        void f();
    }

    public class BImp implements B {
        public void f() {
        }
    }

    private class BImp2 implements B {
        public void f() {
        }
    }

    public interface C {
        void f();
    }

    class CImp implements C {
        public void f() {
        }
    }

    private class CImp2 implements C {
        public void f() {
        }
    }

    private interface D {
        void f();
    }

    private class DImp implements D {
        public void f() {
        }
    }

    public class DImpl2 implements D {
        public void f() {
        }
    }

    public D getD() {
        return new DImpl2();
    }

    private D dRef;

    public void receive(D d) {
        dRef = d;
        dRef.f();
    }
}

interface E {
    interface G {
        void f();
    }

    //Redundant "public"
    public interface H {
        void f();
    }

    void g();
    //cannot be private within an interface
}

public class NestingInterface {
    public class BImpl implements A.B {
        public void f() {
        }
    }

    class CImpl implements A.C {
        public void f() {
        }
    }

    class EImpl implements E {
        public void g() {
        }
    }

    class EImpl2 implements E.G {
        public void f() {
        }

        class EG implements E.G {
            public void f() {
            }
        }
    }

    public static void main(String[] args) {
        A a = new A();
        A a2 = new A();
        a2.receive(a.getD());
    }
}

作为一种新的添加方式,接口也可以被实现为private的,就像在A.D中看到的那样(相同的语法既适用于嵌套接口,也适用于嵌套类)。那么private的嵌套接口能带来什么好处呢?读者可能会猜测,他只能够被实现为DImpl中的一个private内部类,但是A.DImpl2展示了他同样可以被时限为public类。但是A.DImpl2只能被其自身所使用。你无法说他实现了一个private接口D。因此,实现一个private接口只是一种形式,他可以强制该接口中的方法定义不要添加任何类型信息(也就是不允许向上转型)。
getD()方法使我们陷入了一个进退两难的境地,这个问题与private接口相关:他是一个返回对private接口的引用的public方法。你对这个方法的返回只能做些什么呢?在main()中,可以看到数次尝试使用返回值的行为都失败了。只有一种方式可以成功,那就是将返回值交给有权使用它的对象。在本例中,是另一个A通过receiveD()方法来实现的。
接口E说明接口彼此之间也是可以嵌套的。然而,作用于接口的各种规则,特别是所有的接口元素都必须是public的,在此都会被严格执行。因此,嵌套在另一个接口中的接口自动是public的,而不能声明为private的。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容