[英]Enum implementing interface, interface and method visibility
我刚刚遇到以下代码,这让我感到很惊讶,我把它转换成了一个简单的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
,我理解这是因为它是package-private to 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
来说,它是从某个地方继承的,但它不知道在哪里!
在接口中,默认情况下方法是public abstract
。 字段是public static final
你可以使用该方法的原因是接口是包本地的。 尝试将其公之于众。
但是我根本无法使用MyInterface,我理解这是因为它是package-private to custompackage.package1。
接口是包私有的,但所有方法(和字段)都是(隐式或显式)公共的。
似乎MyEnum添加了myMethod()方法,但它没有实现(从外部)MyInterface。
MyEnum
有一个名为myMethod()
的公共方法,无论它是从接口继承(公共)抽象方法还是声明方法本身。 换句话说,即使外面看不到界面,外面肯定可以看到MyEnum
并看到MyEnum.myMethod()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.