ski*_*iwi 7 java enums interface package-private
我刚刚遇到以下代码,这让我感到很惊讶,我把它转换成了一个简单的SSCEE:
custompackage.package1.MyEnum.java
public enum MyEnum implements MyInterface {
    CONSTANT_ONE() {
        @Override
        public void myMethod() {
            //do something very interesting
        }
    },
    CONSTANT_TWO() {
        @Override
        public void myMethod() {
            //do something very interesting
        }
    };
}
interface MyInterface {
    void myMethod();
}
现在从这个包外面,我可以做到以下几点:
Consumer<MyEnum> myMethod = MyEnum::myMethod;
但是我根本无法使用MyInterface,我理解这是因为它是包私有的custompackage.package1.
我不明白究竟发生了什么,似乎添加MyEnum了myMethod()方法,但它没有实现(从外部)MyInterface.
这是如何运作的?
好吧MyInterface,正如你所说,你无法从包外看到- 但MyEnum实际上有一个公共抽象myMethod()方法,你可以用它作为方法参考.
抛开花哨的新Java 8功能,这是有效的(甚至在包外):
// Even MyEnum x = null; will compile, but obviously fail
MyEnum x = MyEnum.CONSTANT_ONE;
x.myMethod();
该方法继承自接口,即使接口本身不可见.
这也不是特定于接口和枚举.例如:
// Foo.java
package foo;
class SuperFoo {
   public void publicMethod() {
   }
}
public class Foo extends SuperFoo {
}
// Bar.java
package bar;
import foo.Foo;
public class Bar {
    public void test() {
        Foo foo = new Foo();
        foo.publicMethod();
    }
}
编译很好,即使甚至Foo没有覆盖publicMethod.就Bar目前而言,它是从某个地方继承的,但它不知道在哪里!
| 归档时间: | 
 | 
| 查看次数: | 449 次 | 
| 最近记录: |