嵌套的默认接口与嵌套的受保护接口有何不同?

时间:2018-02-16 07:27:01

标签: java interface

Java中嵌套的默认接口和嵌套受保护接口有什么区别?为什么甚至允许嵌套的受保护接口?

Test.java

public class Test {
    // not implementable outside of current package
    interface NestedDefaultInterface {

    }

    // not implementable outside of current package?
    protected interface NestedProtectedIface {

    }
}

// both interfaces can be implemented
class Best implements Test.NestedProtectedIface, Test.NestedDefaultInterface { 

}

MyClass.java

class AClass implements Test.NestedProtectedIface { //Error

}

class AnotherClass implements Test.NestedDefaultInterface { //Error

}

class OneMoreClass extends Test implements Test.NestedProtectedIface { //Error

}

1 个答案:

答案 0 :(得分:4)

显示视觉差异:

package com.one

public class Test {
    // not implementable outside of current package
    interface NestedDefaultInterface {

    }

    // implementable in child classes outside of package
    protected interface NestedProtectedIface {

    }
}

在包裹之外:

package com.two

class SubTest extends Test { 
    public void testProtected() {
        NestedProtectedIface npi = new NestedProtectedIface () {
           // implementation
        };
    }

    public void testDefault() {
        // Won't compile!
    //    NestedDefaultInterface ndi = new NestedDefaultInterface() {
    //    };
    }
}

这里的混乱是关于可见性。

扩展课程时,您可以从protected引用访问所有this个父级属性。

对于default访问修饰符,它不会在包之外工作。

最流行的嵌套界面的真实示例是Map.Entry<K,V> java.util.Map

Map的每个实现都提供了自己的Entry<K,V>实现。 (Node<K,V>中的HashMapEntry<K,V>中的TreeMap等等。