4

Java では、次の例のようにローカル抽象クラスを定義できます。

public class Foo {

    public void foo() {
        abstract class Bar {          // Bar is a local class in foo() ...
            abstract void bar();
        }

        new Bar() {                   // ... and can be anonymously instantiated
            void bar() {
                System.out.println("Bar!");
            }
        }.bar();
    }
}

何らかの理由で、ローカル クラスの代わりに「ローカル インターフェイス」を定義しようとすると、次のようになります。

public class Foo {

    public void foo() {
        interface Bar {           // Bar was supposed to be a local interface...
            void bar();
        }

        new Bar() {               // ... to be anonymously instantiated
            void bar() {
                System.out.println("Bar!");
            }
        }.bar();
    }
}

Java は、「メンバー インターフェイス Bar は、最上位のクラスまたはインターフェイス内でしか定義できない」と不満を漏らしています。これには理由がありますか?それとも、私が犯した間違いを見逃していますか?

4

4 に答える 4

5

Java 言語仕様は、なぜそのように設計されたのかを説明していませんが、許可されているものと許可されていないものについて説明しています。

メソッド本体の形式は次のとおりです。

MethodBody:
    Block 
    ;

どこBlockですか

Block:
    { BlockStatementsopt }

BlockStatements:
    BlockStatement
    BlockStatements BlockStatement

BlockStatement:
    LocalVariableDeclarationStatement
    ClassDeclaration
    Statement

したがって、クラス宣言は許可されますが、インターフェイスは許可されません。


呼び出し元の観点からは、ローカル インターフェイスを持つことはあまり有用ではないと主張できます。何の役にも立ちません。インターフェイスは動作を記述するためのものですが、インターフェイスはローカルであるため、呼び出し元はそれを利用できません。クラスで動作を定義して実装することもできます。

于 2014-02-02T21:23:18.310 に答える