第8.1.5节
class A{
  private interface D{
       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();
}
}
在main中生成A的一个实例a
A.D ad=a.getD();
A.DImp2 di2=a.getD();
a.getD().f();
这三条为什么通不过,而必须写成
a.receiveD(D.getD());
才能通过,这是为什么啊

解决方案 »

  1.   


    A.D ad=a.getD();     // D是私有的,只在A中可见
    A.DImp2 di2=a.getD();//agetD() 返回的是D 不能转化为其实现类
                                             //A.DImp2 di2=(A.DImp2)a.getD(); 这样就ok
    a.getD().f();          //D是私有的
      

  2.   

    TIJ里面写的很清楚啊。A.D ad=a.getD();//因为D接口是类中的私有接口,所以A.D 不合法。在类的外部,你怎么知道A中有一个D??A.DImp2 di2=a.getD();//class A 中的getD()函数,返回类型为D,函数返回时存在“上传”现象,定义在类A中没问题,因为A类知道自己肚子中的一切,可你在类外头调用这个函数就有问题了。外部世界,我们只知道有一个DImp2,不知道D,也不知道DImp2是通过什么继承的。所以不允许外部世界实现这种“上传”。a.getD().f()//和上面一个道理。不允许在外部世界“上传”
      

  3.   

    若将D接口改为public
    A.DImp2 di2=a.getD();能通过吗
      

  4.   

    父类对象不能自动转化为子类对象这是Java OOP的基本概念比如 汽车是交通工具但是交通工具不一定就是汽车你的方法就返回一个交通工具对象,但是你想把它作为汽车对象这肯定不行,要经过强制转换才可以如: A.DImp2 di2=(A.DImp2)a.getD();