为什么我不能调用添加到Java中的匿名类的方法?

jor*_*npg 4 java anonymous-class java-7

如果匿名类正在扩展/实现类/接口,为什么我不能添加新方法?

换句话说,这有效:

class A {
    void a() {
        System.out.println("a in A");
    }
}

class B extends A {
    @Override
    void a() {
        System.out.println("a in B");
    }
    void b() {
        System.out.println("b in B");
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用:

class C {
    A anonA() {
        return new A() {
            void b() {
                System.out.println("b in C");
            }
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

鉴于:

public static void main(String[] args) {
    B b = new B();
    b.b();

    // C c = new C();
    // A anonA = c.anonA();
    // anonA.b();
    // yields:  java: cannot find symbol \ symbol:   method b()
}
Run Code Online (Sandbox Code Playgroud)

Sot*_*lis 9

在编译时,方法调用是根据调用它们的表达式的类型确定的.在您的示例中,您尝试调用b()类型的表达式A.A不声明b()方法,因此它不起作用.

它也不适用于您的具体B类示例

A notAnonA = new B();
notAnonA.b(); // fails to compile
Run Code Online (Sandbox Code Playgroud)

你可以在新的匿名类的主体内添加一个新方法,但是你只能在类或实际的新匿名类实例创建表达式中使用它.

new A() {
    void undeclared() {}
}.undeclared();
Run Code Online (Sandbox Code Playgroud)