Java 为什么私有内部接口的方法必须是公共的?
我有一个实现私有内部接口的私有内部类。我通常省略私有内部类中的私有修饰符,以使代码更干净。不幸的是,在这种情况下,我得到了“无法降低可见性错误”,即使我实际上并没有降低可见性Java 为什么私有内部接口的方法必须是公共的?,java,Java,我有一个实现私有内部接口的私有内部类。我通常省略私有内部类中的私有修饰符,以使代码更干净。不幸的是,在这种情况下,我得到了“无法降低可见性错误”,即使我实际上并没有降低可见性 public class Foo { private interface IBar{ void foo(); } private static class Bar implements IBar{ @Override public void foo(
public class Foo {
private interface IBar{
void foo();
}
private static class Bar implements IBar{
@Override
public void foo() { // Must be public :(
}
}
}
我认为没有办法解决这个问题?接口的所有方法都是
public
和abstract
。这是规则
只有将它们公开
才有意义,因为它们将通过实现可能来自不同包的类来实现
即使它是一个内部的
接口
,它仍然是接口
,因此规则不会改变。接口的所有方法都是公共的
和抽象的
。这是规则
只有将它们公开
才有意义,因为它们将通过实现可能来自不同包的类来实现
即使它是一个内部
接口
,它仍然是接口
,因此规则不会改变。接口上的所有方法都必须声明为公共
。如果未在foo
方法上指定访问修饰符,则默认情况下会为其分配包保护的访问。由于受包保护的比public
更难访问,因此代码降低了foo
方法的可访问性。接口上的所有方法都必须声明为public
。如果未在foo
方法上指定访问修饰符,则默认情况下会为其分配包保护的访问。由于包保护
比公共
更难访问,因此该代码降低了foo
方法的可访问性。接口
的所有方法都是公共
和抽象
。如果您没有定义任何修改器,那么默认情况下它是public
和abstract
重写的一般规则是不能降低方法的可见性。在类中,如果您没有定义任何修饰符,那么默认情况下它将是默认的,并且默认情况下不太可见,而不是公共的。所以这里它必须是公共的一个接口的所有方法都是公共的
和抽象的
。如果您没有定义任何修改器,那么默认情况下它是public
和abstract
重写的一般规则是不能降低方法的可见性。在类中,如果您没有定义任何修饰符,那么默认情况下它将是默认的,并且默认情况下不太可见,而不是公共的。所以这里它必须是公共的,因为一个接口的所有方法都必须是公共的。否则,它对私有内部接口是没有意义的。对于私有内部类,您最好从公共内部基类继承。我不认为使用私有接口有什么意义。不,没有。一个接口就是你是“公共”合同。否则是没有意义的,也没有任何理由这样做。@t在我的情况下,这是因为我需要创建一个私有内部类的代理和proxy.newProxyInstance(…),它需要一个接口类。因为接口的所有方法都必须是公共的
。否则,它对私有内部接口是没有意义的。对于私有内部类,您最好从公共内部基类继承。我不认为使用私有接口有什么意义。不,没有。一个接口就是你是“公共”合同。否则没有任何意义,也没有任何理由做其他事情。@t在我的情况下,这是因为我需要创建一个私有内部类的代理和proxy.newProxyInstance(…),它需要一个接口类。+1技术JVM不允许访问其他类的私有成员。事实上,您可以这样做完全是由于编译器生成的代码。对于私有接口,接口方法私有是完全有意义的。@fhucho但您永远无法实现接口…private
方法不能被重写,这没有意义…@MadProgrammer我可以用私有方法创建一个私有静态类Foo,并在另一个私有静态类栏中重写此方法。@fhuch尝试将@overrided
标记添加到栏中的方法,它将给你一个错误。尝试从Bar#privateMethod
中调用super.privateMethod()
,它会给您一个错误。您不能“重写”私有方法。您可以使用相同的名称,但这与重写…+1不同,因为JVM不允许访问其他类的私有成员。事实上,您可以这样做完全是由于编译器生成的代码。对于私有接口,接口方法私有是完全有意义的。@fhucho但您永远无法实现接口…private
方法不能被重写,这没有意义…@MadProgrammer我可以用私有方法创建一个私有静态类Foo,并在另一个私有静态类栏中重写此方法。@fhuch尝试将@overrided
标记添加到栏中的方法,它将给你一个错误。尝试从Bar#privateMethod
中调用super.privateMethod()
,它会给您一个错误。您不能“重写”私有方法。您可以使用相同的名称,但这与重写不同…好的,但是私有类Foo的私有方法实际上具有与具有公共修饰符完全相同的可见性。好的,但是私有类Foo的私有方法实际上具有与具有公共修饰符完全相同的可见性。