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

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

如果未指定接口是public接口,则只能在与接口相同的程序包中定义的类中访问您的接口。

但是,这个

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

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

我想我不必使用界面 – 我喜欢它,因为它保持了良好的组织。

接口本身可以是包私有的,而不是其中的方法。 您可以定义一个只能在其定义的包中使用(通过名称)的接口,但其方法与所有接口方法一样public 。 如果一个类实现了该接口,那么它定义的方法必须是public 。 这里的关键是它是在包外不可见的接口类型 ,而不是方法。 文档不正确,因为使用界面中定义的方法与使用界面本身不同。

还要注意,在定义接口时,在方法定义之前不添加public不会更改任何内容,因为这些方法都是隐式public

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

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

认为 (虽然我可能错了)这里讨论的弱访问权限是针对NewClassfoo()bar()方法。 所有的接口方法都是隐式public ,但是在NewClass你将它们保留为package-private,这是一个比public弱的保证。 将NewClass更改为读取

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

可能会解决这个问题。

什么对我有用,可以解决单inheritance问题:

而不是A扩展B实现C

我有抽象D(C中的包保护接口)扩展B

然后A延伸D.

工作良好。 干净,tbh。