gpt4 book ai didi

java - 枚举实现接口(interface)、接口(interface)和方法可见性

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:22:50 26 4
gpt4 key购买 nike

我刚刚看到下面的代码,这让我有点吃惊,不过我在这里将它转换为一个简单的 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 是包私有(private)的。

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

最佳答案

好吧,正如您所说,您无法从包外部看到 MyInterface - 但是 MyEnum 实际上有一个公共(public)抽象 myMethod()方法,您可以将其用作方法引用。

抛开花哨的 Java 8 新功能不谈,这是有效的(即使在包之外):

// Even MyEnum x = null; will compile, but obviously fail
MyEnum x = MyEnum.CONSTANT_ONE;
x.myMethod();

方法是从接口(interface)继承的,即使接口(interface)本身是不可见的。

这也不特定于接口(interface)和枚举。例如:

// 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 而言,它是从某处 继承的,但它不知道从哪里继承!

关于java - 枚举实现接口(interface)、接口(interface)和方法可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23811479/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com