7

我刚刚遇到以下代码,这让我有点惊讶,不过我在这里将它转换为一个简单的 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

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

4

3 回答 3

5

好吧,正如您所说,您无法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继承而来的,但它不知道在哪里!

于 2014-05-22T15:49:05.950 回答
1

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

该接口是包私有的,但所有方法(和字段)都是(隐式或显式)公共的。

似乎 MyEnum 添加了 myMethod() 方法,但它没有(从外部)实现 MyInterface。

MyEnum有一个名为 的公共方法myMethod(),无论它是从接口继承(公共)抽象方法还是声明了方法本身。换一种说法,即使外面看不到界面,外面也一定能看到MyEnum看到MyEnum.myMethod()

于 2014-05-22T15:58:44.540 回答
1

默认情况下,接口中的方法是public abstract。字段是public static final

您可以使用该方法的原因是该接口是本地包。尝试公开。

于 2014-05-22T15:49:19.777 回答