嵌套接口-接口

这是一个很绕的例子,没有用过,但是说不定以后会用到

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接口不能在定义它的类之外被实现


你可能感兴趣的:(Thinking,in,JAVA)