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(); }
我认为 (虽然我可能错了)这里讨论的弱访问权限是针对NewClass
的foo()
和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。