示例源码
接口可以嵌套在类或其他接口中。这揭示了许多非常有趣的特性:
package com.mufeng.theninthchapter;
class A {
interface B {
void f();
}
public class BImp implements B {
@Override
public void f() {
// TODO Auto-generated method stub
}
}
private class BImp2 implements B {
@Override
public void f() {
// TODO Auto-generated method stub
}
}
public interface C {
void f();
}
class CImp implements C {
@Override
public void f() {
// TODO Auto-generated method stub
}
}
private class CImp2 implements C {
@Override
public void f() {
// TODO Auto-generated method stub
}
}
private interface D {
void f();
}
private class DImp implements D {
@Override
public void f() {
// TODO Auto-generated method stub
}
}
public class DImp2 implements D {
@Override
public void f() {
// TODO Auto-generated method stub
}
}
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 interface H {
void f();
}
void g();
// Cannot be private within an interface:
// private interface I{
// void f();
// }
}
public class NestingInterfaces {
public class BImp implements A.B {
@Override
public void f() {
// TODO Auto-generated method stub
}
}
class CImp implements A.C {
@Override
public void f() {
// TODO Auto-generated method stub
}
}
// Cannot implement a private interface except
// within that interface's defining class
// class DImp implements A.D {
// @Override
// public void f() {
// // TODO Auto-generated method stub
//
// }
// }
class EImp implements E {
@Override
public void g() {
// TODO Auto-generated method stub
}
}
class EGImp implements E.G {
@Override
public void f() {
// TODO Auto-generated method stub
}
}
class EImp2 implements E {
@Override
public void g() {
// TODO Auto-generated method stub
}
class EG implements E.G {
@Override
public void f() {
// TODO Auto-generated method stub
}
}
}
public static void main(String[] args) {
A a = new A();
// Can't access A.D
// !A.D ad=a.getD();
// Doesn't return anything but A.D
//!A.DImp2 di2 = a.getD();
//Cannot access a member of the interface
//!a.getD().f();
//Only another A can do anything with getD():
A a2=new A();
a2.receiveD(a.getD());
}
}
源码解析
在类中嵌套接口的语法是相当显而易见的,就像非嵌套接口一样,可以拥有
public和“包访问”两种可视性。
作为一种新添加的方式,接口也可以被实现为
private的,就像在
A.D中所看到的(相同的语法既适用于嵌套接口,也适用于嵌套类)。那么
private的嵌套接口能带来什么好处呢?读者可能会猜想,它只能够被实现为
DImple中的一个
private内部类,但是
A.DImp2展示了它同样可以被实现为
public类。但是,
A.DImp2只能被其自身所使用。你无法说它实现了一个
private接口
D。因此,实现一个
private接口只是一种方式,它可以强制该接口中的方法定义不要添加任何类型信息(也就是说,不允许向上转型)。
getD()方法使我们陷入了一个进退两难的境地,这个问题与
private接口相关:它是一个返回对
private接口的引用的
public方法。你对这个方法的返回值能做些什么呢?在
main()中,可以看到数次尝试使用返回值的行为都失败了。只有一种方式可成功,那就是将返回值交给有权使用它的对象。在本例中,是另一个
A通过
receiveD()方法来实现的。
接口
E说明接口彼此之间也可以嵌套。然而,作用于接口的各种规则,特别是所有的接口元素必须是
public的,在此都会被严格执行。因此,嵌套在另一个接口中的接口自动就是
public的,而不能声明为
private。
NestingInterfaces展示了嵌套接口的各种实现方式。特别要注意的是,当实现某个接口时,并不需要实现嵌套在其内部的任何接口。而且,
private接口不能在定义它的类之外被实现。