在 A 里头当然可以 “向上转型”
但是不能: A.D ad = a.getD();

解决方案 »

  1.   

    个人认为不能 A.D ab = a.getD(); 是因为A.D 是 private 
    因为假如我将 D 和 DImp2 ,以及dRef, receiveD() 改成以下形式,编译通过,并正确输出:
    private interface D extends B {
    void f();
    }
    public class DImp2 implements D {
    public void f(){System.out.println("DImp2");}
    }
    public B getD(){ return new DImp2()/* or DImp(); no difference*/;}
    private B dRef; //OK.   but u cannot new D(); abstract class same
    public void receiveD (B d) {
    dRef = d;
    dRef.f();
    }另外,这一句:“将 private interface 实现出来,只是一种方法,用以强迫‘该 interface 中的函数的定义’不要被加上任何型别信息”  
    interface 中的函数定义怎样算加上型别信息,又怎样算没加? 请赐教  谢谢!!
      

  2.   

    上面的代码有点错误,我加了点注释,结果复制出来看起来有点问题,其实是这样的:
    private interface D extends B {
    void f();
    }
    public class DImp2 implements D {
    public void f(){System.out.println("DImp2");}
    }
    public B getD(){ return new DImp2();}
    private B dRef;
    public void receiveD (B d) {
    dRef = d;
    dRef.f();
    }
      

  3.   

    又漏了,今天是怎么搞的 在main() 里加上A.B ab = a.getD(); 再配合楼上的代码,能够输出 DImp
    所以我认为不能A.D ad = a.getD(); 是access的问题,而与能否向上转型无关
      

  4.   

    向上转型 就是把子类强制转化成某超类。
    由于接口的存取范围私有化了,所以无法 向上转型。 也就是说无法使用超类的类型来保存子类的实例了。interface 中的函数定义怎样算加上型别信息,又怎样算没加?就是 通过某个类型类存取某个方法。
    比如 a.getD(); 其中的 getD() 就带有 a 类型信息。后面好像会有一章讲专门讲这个的。如果没有讲,你自己研究一下 Class 这个东西。---------------------------------------------------------------------------------------
     infinite_wxy() 个人认为不能 A.D ab = a.getD(); 是因为A.D 是 private
    ---------------------------------------------------------------------------------------
    就是这说法了。
      

  5.   

    NALUHODO...   多谢了