这是一个很绕的例子,没有用过,但是说不定以后会用到
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 Dimp2 implements D {
public void f() {}
}
public D getD() { return new Dimp2(); }
private D dRef;
public void receiveD(D d) {
dRef = d;
dRef.f();
}
}
interface E {
interface G {
void f();
}
//这里不加修饰也是public 但是不能是private的
public interface H {
void f();
}
void g();
}
public class NestingInterfaces {
public class Bimp implements A.B {
public void f() { System.out.println("Bimp A.B f()"); }
}
class Cimp implements A.C {
public void f() {}
}
//因为A.D是private的所有不能向上面一样实现
//class Cimp implements A.D
class Eimp implements E {
public void g() {}
}
class DGimp implements E.G {
public void f() {}
}
class Eimp2 implements E {
public void g() {}
class EG implements E.G {
public void f() {}
}
}
public static void main(String[] args) {
A a = new A();
//A.Dimp2 ad = a.getD();//: cannot convert from A.D to A.Dimp2
//A.Dimp2 dip2 = a.getD();//cannot convert from A.D to A.Dimp2
//a.getD().f();//The type A.D is not visible
A a2 = new A();
a2.receiveD(a.getD());
}
}
这个getD方法有点意思,代理中尝试了各种方式调用这个getD都不行。这个问题域private接口相关(D是private的):getD是一个返回对private接口的引用的public方法。在main中只有一中方法成功了,那就是把getD的返回值交给有权使用它的对象。因为receivdD这个方式有权利使用D的对象,但是main中其他引用都没有权利。
从Eimp implements E可以发现,实现一个接口并不需要是实现嵌套在其内部的任何接口。
还有private接口不能在定义它的类之外被实现