Java教程说我可以有一个包私有接口,但我不能

2022-09-01 05:49:31

Java教程“定义接口”中,它说

如果未指定接口为 ,则只有接口才能由与接口相同的包中定义的类访问。public

但是,这

interface PPInterface {
    void foo();
    void bar();
}

class NewClass implements PPInterface {
    void foo() {}
    void bar() {}
}

生成编译器错误,因为我'试图分配较弱的访问权限;是公开的'。所以文档是错误的,或者我做错了什么,或者我误解了文档?NewClass

我想我不必使用界面 - 我喜欢它,因为它可以很好地组织事情。


答案 1

接口本身可以是包私有的,而不是其中的方法。您可以定义一个只能在定义它的包中使用(按名称)的接口,但其方法与所有接口方法一样。如果某个类实现该接口,则它定义的方法必须是 。这里的关键是,它是在包外部不可见的接口类型,而不是方法。文档没有错误,因为使用接口中定义的方法与使用接口本身不同。publicpublic

另请注意,在定义接口时,在方法定义之前不添加不会更改任何内容,因为这些方法都是隐式的。publicpublic

如果您实现接口的类本身是包私有的,那么接口方法的性显然不是问题。当然,如果单继承问题没有妨碍您,您也可以使用抽象类而不是接口:public

abstract class Whatever {
  abstract void foo();
  abstract void bar();
}

答案 2

我认为(尽管我对此可能是错误的),这里讨论的较弱的访问权限是 针对 和 中的方法。所有接口方法都是隐式的,但是在您中将它们保留为包私有,这是比 弱的保证。更改为读取foo()bar()NewClasspublicNewClasspublicNewClass

class NewClass implements PPInterface{
    public void foo() {}
    public void bar() {}
}

可能会解决这个问题。