2011-12-08 4 views
3

私のコードは次のとおりです。Abstract Inner Classのメソッドをオーバーライドするにはどうすればよいですか?

コア/ Base.java

package core; 
public class Base { 
    public abstract class AbstractInner { 
     abstract void run(); 
    } 
} 

Test.java

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と同じパッケージにある場合、コンパイルは成功します。どうしてか分かりません。

+0

@override注釈がありません...私は間違っている可能性があります。私はjavaにも新しいです。 – worked

+0

@overrideアノテーションはこの問題を解決しません。あなたが試すことができます。 – user1086901

答えて

5

パッケージプライベートメンバーのオーバーライドを管理する非直感的なルールがいくつかあります。基本的には、上書きするクラスが同じパッケージ内にある場合は、package-privateメソッドをオーバーライドできます。そうでなければ、への可視性がありません。AbstractInnerの宣言run()を参照してください。したがって、それを上書きすることはできません。代わりに、同じシグネチャで新しいメソッドを宣言しています。

run()をデフォルトの可視性を使用する代わりに(したがってInner)にすると、意図したとおりに動作します。

インターフェイス内でのみ暗黙的にpublicのメソッドが宣言されていることを思い出してください。抽象クラスでは、暗黙的にパッケージプライベートです。

+0

ありがとうございます。 – user1086901

+0

@ user1086901:これが正しい答えだった場合は、チェックマークボタンを使用してそれを承認済みとしてマークしてください。 –

関連する問題