繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM