35

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

如果您没有指定接口是public,那么您的接口将只能被定义在与接口相同的包中的类访问。

然而,这

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

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

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

我想我不必使用界面——我喜欢它,因为它可以让事情井井有条。

4

3 回答 3

66

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

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

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

abstract class Whatever {
  abstract void foo();
  abstract void bar();
}
于 2011-01-26T05:37:16.487 回答
6

认为(尽管我可能错了)这里讨论的较弱的访问权限foo()bar()针对NewClass. 所有接口方法都是隐式的public,但是NewClass您将它们保留为包私有,这是比public. 改变NewClass阅读

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

可能会解决这个问题。

于 2011-01-26T05:32:51.800 回答
0

解决单继承问题的方法对我有用:

而不是 A 扩展 B 实现 C

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

然后 A 扩展 D

工作正常。也干净,tbh。

于 2018-05-25T22:25:30.467 回答