枚举实现接口,接口和方法可见性

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();
}
Run Code Online (Sandbox Code Playgroud)

现在从这个包外面,我可以做到以下几点:

Consumer<MyEnum> myMethod = MyEnum::myMethod;
Run Code Online (Sandbox Code Playgroud)

但是我根本无法使用MyInterface,我理解这是因为它是包私有的custompackage.package1.

我不明白究竟发生了什么,似乎添加MyEnummyMethod()方法,但它没有实现(从外部)MyInterface.
这是如何运作的?

Jon*_*eet 5

好吧MyInterface,正如你所说,你无法从包外看到- 但MyEnum实际上有一个公共抽象myMethod()方法,你可以用它作为方法参考.

抛开花哨的新Java 8功能,这是有效的(甚至在包外):

// Even MyEnum x = null; will compile, but obviously fail
MyEnum x = MyEnum.CONSTANT_ONE;
x.myMethod();
Run Code Online (Sandbox Code Playgroud)

该方法继承自接口,即使接口本身不可见.

这也不是特定于接口和枚举.例如:

// 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

编译很好,即使甚至Foo没有覆盖publicMethod.就Bar目前而言,它是从某个地方继承的,但它不知道在哪里!