Java - 继承的方法com.example.project.ConcreteA无法隐藏com.example.project.MyInterface中的抽象方法

时间:2015-02-26 23:22:32

标签: java inheritance interface access-modifiers

出于某种原因,我不能将接口中的方法声明为仅包;它会自动声明为公开。这是简化的代码:

package com.example.project;

public interface MyInterface {

    void foo();
    Thing bar(); // The class Thing is in the com.example.project package, but what it does isn't important.

}



package com.example.project;

public abstract class SimpleConcrete implements MyInterface { // Initializes all methods as hooks

    protected Thing bar = new Thing();

    void foo() {}
    Thing bar() { return bar }

}



package com.example.project;

public class ConcreteA extends SimpleConcrete {

    void bar() {
        // code here...
    }

}



package com.example.project;

public class ConcreteB extends SimpleConcrete {

    void bar() {
        // more code here...
    }

}

当我尝试编译时,这些错误都会连接起来:

  

文件: C:\ ProjectFolder \ com \ example \ project \ SimpleConcrete.java [line:7]

     

错误:无法降低来自me.mathmaniac.everworlds.Block的继承方法的可见性

     

文件: C:\ ProjectFolder \ com \ example \ project \ ConcreteA.java [line:3]

     

错误:继承的方法com.example.project.SimpleConcrete.foo()无法隐藏com.example.project.MyInterface中的公共抽象方法

     

文件: C:\ ProjectFolder \ com \ example \ project \ ConcreteB.java [line:3]

     

错误:继承的方法com.example.project.SimpleConcrete.foo()无法隐藏com.example.project.MyInterface中的公共抽象方法

有没有人知道如何解决这个问题,或者我是否必须将我的接口公开到整个Java代码,而不仅仅是打开包? 出于安全原因,我想保持方法只对包打开,但是需要,我会尝试找到另一种解决问题的方法。

2 个答案:

答案 0 :(得分:3)

Java中接口中的所有方法都是隐式公共的。有关详细信息,请参阅此处:http://docs.oracle.com/javase/tutorial/java/IandI/interfaceDef.html

您可以通过以下方式声明接口包级别:

interface MyInterface {

    void foo();
    Thing bar();
}

这至少会将其封装在该包中。

答案 1 :(得分:1)

界面中声明的所有方法都是implicitly public

  

界面中的所有抽象,默认和静态方法都是隐式public,因此您可以省略public修饰符。

要在方法上使用任何其他访问修饰符,必须将接口转换为abstract类,并将方法转换为abstract方法。