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

Pet*_*ete 31 java interface access-specifier

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

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

但是,这个

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

class NewClass implements PPInterface {
    void foo() {}
    void bar() {}
}
Run Code Online (Sandbox Code Playgroud)

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

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

Col*_*inD 60

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

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

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

abstract class Whatever {
  abstract void foo();
  abstract void bar();
}
Run Code Online (Sandbox Code Playgroud)

  • 呃,由于Java的"接口"的访问限制限制,我们又被迫用抽象类来破解http://stackoverflow.com/questions/5376970/protected-in-interfaces/5377300#5377300 (5认同)
  • 我认为这是Java的最大烦恼之一。我想定义一个接口,该接口允许未经检查地访问集合的成员。但是,当公共类实现此接口时,我不希望包外的其他人能够调用这些未经检查的方法。我唯一的选择是使用单继承抽象类或包装器类。老实说,我不喜欢这两种选择。 (2认同)

tem*_*def 6

认为(尽管我可能是错误的这一点),其正在这里讨论的较弱的访问权限是在foo()bar()方法NewClass。所有的接口方法都是隐式的public,但是NewClass你已经将它们保留为包私有的,这比public. 更改NewClass阅读

class NewClass implements PPInterface{
    public void foo() {}
    public void bar() {}
}
Run Code Online (Sandbox Code Playgroud)

可能会解决这个问题。

  • @Pete- 我认为这里有两个不同的问题。通过保留接口包私有,可以引用该接口的唯一类必须在同一个包中。但是,该接口定义的方法是隐式公开的,因此任何实现该接口的类也必须将那些特定的函数标记为私有。所以不,文档并没有错 - 只有两个单独的可见性级别在起作用。 (3认同)