Java 如何重写抽象内部类的方法?

Java 如何重写抽象内部类的方法?,java,overriding,abstract-class,javac,inner-classes,Java,Overriding,Abstract Class,Javac,Inner Classes,我的代码是: core/Base.java package core; public class Base { public abstract class AbstractInner { abstract void run(); } } class Test extends core.Base { class Inner extends AbstractInner { void run() {} } } Test.java pa

我的代码是:

core/Base.java

package core;
public class Base {
    public abstract class AbstractInner {
        abstract void run();
    }
}
class Test extends core.Base {
    class Inner extends AbstractInner {
        void run() {}
    }
}
Test.java

package core;
public class Base {
    public abstract class AbstractInner {
        abstract void run();
    }
}
class Test extends core.Base {
    class Inner extends AbstractInner {
        void run() {}
    }
}
javac抱怨如下

shell> javac -cp . Test.java 
Test.java:2: Test.Inner is not abstract and does not override abstract method run() in core.Base.AbstractInner
    class Inner extends AbstractInner {
    ^
我犯了什么错


如果Base与Test位于同一个包中,则编译成功。我不知道为什么。

有一些非直观的规则控制包私有成员的覆盖性。本质上,如果重写类位于同一个包中,则可以重写包私有方法。如果不是,它就无法看到
AbstractInner
run()
声明,因此无法覆盖它。相反,您正在声明一个具有相同签名的新方法

如果在
AbstractInner
中(因此也在
Inner
中)使
run()
受保护(或公开),而不是使用默认可见性,它将按预期工作


回想一下,只有在接口中才隐式地声明了方法
public
。在抽象类中,它们是隐式包私有的。

@缺少覆盖注释。。。我可能是错的,虽然我也是java新手。@重写注释不能解决这个问题。你可以试试。